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

將導致查詢是一個prefixQuery:公司:A *爲什麼這個Lucene查詢「contains」而不是「startsWith」?

我仍然會得到結果,如「艦隊非洲」它是相當明顯的是,A是不是在一開始,因此給了我意外的結果。

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

將導致查詢爲termQuery:company:a *且不返回任何結果。可能是因爲它將查詢解釋爲完全匹配,並且我的值都不是「a *」字面值。

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

將返回與前綴查詢相同的結果;

我在做什麼錯?

回答

0

簡短回答:所有查詢都不會將搜索限制在字段的開頭。 你需要一個EdgeNGramTokenFilter或類似的東西。 請參閱this question瞭解Lucene中自動完成的實現。

+0

這個例子當然太過分了吧?難道不可能在沒有所有模糊的情況下創建一個類似於startwith的查詢嗎? – 2009-03-03 11:11:01

4

StandardAnalyzer將「艦隊非洲」標記爲「艦隊」和「非洲」。您的a *搜索將匹配晚期。

如果你想考慮「艦隊非洲」作爲一個單一的術語,使用一個分析器,不會打破你的字符串空白。 KeywordAnalyzer就是一個例子,但是你仍然想要小寫你的數據,所以查詢不區分大小寫。