2009-03-03 22 views
5
string q = "m"; 
Query query = new QueryParser("company", new StandardAnalyzer()).Parse(q+"*"); 

sẽ cho kết quả truy vấn là một prefixQuery: Công ty: a *Tại sao truy vấn Lucene này là "chứa" thay vì "startsWith"?

Tôi vẫn sẽ có được kết quả như "Hạm đội châu Phi", nơi nó là khá rõ ràng rằng A không phải là lúc bắt đầu và do đó mang lại cho tôi kết quả không mong muốn .

Query query = new TermQuery(new Term("company", q+"*")); 

sẽ dẫn đến truy vấn là một thuật ngữQuery: company: a * và không trả lại bất kỳ kết quả nào. Có lẽ vì nó diễn giải truy vấn dưới dạng đối sánh chính xác và không có giá trị nào của tôi là chữ "a *".

Query query = new WildcardQuery(new Term("company", q+"*")); 

sẽ trả lại kết quả tương tự như tiền tố;

Tôi đang làm gì sai?

Trả lời

0

Câu trả lời ngắn: tất cả truy vấn của bạn không hạn chế tìm kiếm ở đầu trường. Bạn cần EdgeNGramTokenFilter hoặc một cái gì đó tương tự. Xem this question để thực hiện tự động hoàn tất trong Lucene.

+0

Chắc chắn ví dụ quá xa, phải không? Không phải là nó có thể tạo ra một startwith như truy vấn mà không có tất cả các fuzz? –

+0

Không phải là tôi biết. startswith là khó khăn. Nếu bạn quản lý để làm điều này, xin vui lòng cho tôi biết. Từ những gì tôi thấy, PrefixQuery có nghĩa là tìm kiếm sự bắt đầu của bất kỳ thuật ngữ nào, không chỉ là từ đầu tiên. –

+0

Điều này làm tôi ngạc nhiên. Startswith phải là truy vấn dễ dàng nhất để làm, phải không? –

4

StandardAnalyzer sẽ thông báo "Hạm đội Châu Phi" thành "hạm đội" và "châu phi". Tìm kiếm * của bạn sẽ khớp với cụm từ sau.

Nếu bạn muốn xem xét "Hạm đội châu Phi" dưới dạng một cụm từ, hãy sử dụng máy phân tích không chia chuỗi của bạn trên khoảng trắng. KeywordAnalyzer là một ví dụ, nhưng bạn vẫn có thể muốn viết thường xuyên dữ liệu của mình để các truy vấn phân biệt chữ hoa chữ thường.

Các vấn đề liên quan