2016-03-08 100 views
1

你好,大家好我有一個問題:)Lucene的BooleanQuery.Builder構建不起作用

我創建了一個BooleanQuery像這樣:

BooleanQuery.Builder qry = new BooleanQuery.Builder(); 
qry.add(new TermQuery(new Term("Name", "Anna")), BooleanClause.Occur.SHOULD); 

如果我做這樣的搜索現在:

TopDocs docs = searcher.search(qry.build(), hitsPerPage); 

它獲得零結果?但如果我使用此代碼:

TopDocs docs = searcher.search(parser.parse(qry.build().toString()), hitsPerPage); 

然後我得到正確的結果?你能解釋一下爲什麼我必須再解析它嗎?

我使用的版本5.5.0和名稱是一個TextField

回答

3

一個TextField通過分析運行數據,並可能會產生術語"anna"(小寫)。 A TermQuery不通過分析器運行任何操作,因此它搜索"Anna"(大寫),並且這不匹配。使用小寫字母創建TermQuery,您應該看到結果:new TermQuery(new Term("Name", "anna"))BooleanQuery與此無關,事實上,這個特定的查詢會將自身重寫爲底層的TermQuery,因爲這是唯一的子查詢。 解析器採用字符串"Name:Anna"(由TermQuery生成),通過分析器運行它,併爲您提供一個"Name:anna"TermQuery,這就是爲什麼它在您通過解析器運行查詢時有效 - 它涉及必要的分析步驟。

+0

啊好吧謝謝非常多:)我在哪裏可以設置忽略大小寫? – Montezuma

+1

Lucene並沒有真正以這種方式工作,您可以在某處設置忽略大小寫。這一切都取決於你的分析儀。大多數分析器都包含一個小寫標記過濾器,它將小寫所有內容。您必須確保您的查詢通過兼容的分析器(理想情況下是同一個分析器)運行,以便生成匹配的令牌。 TermQuery不使用任何分析器,因此您必須事先執行該步驟,例如通過使用查詢解析器,它通過分析器運行的東西(實際上沒有首先構建布爾查詢)。 – knutwalker