在路加福音,下面的搜索表達式返回23個結果:盧克Lucene的BooleanQuery
docurl:www.siteurl.com docfile:Tomatoes*
如果我通過這同樣表達了我的C#應用程序Lucene.NET用以下實現:
IndexReader reader = IndexReader.Open(indexName);
Searcher searcher = new IndexSearcher(reader);
try
{
QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
BooleanQuery bquery = new BooleanQuery();
Query parsedQuery = parser.Parse(query);
bquery.Add(parsedQuery, Lucene.Net.Search.BooleanClause.Occur.MUST);
int _max = searcher.MaxDoc();
BooleanQuery.SetMaxClauseCount(Int32.MaxValue);
TopDocs hits = searcher.Search(parsedQuery, _max)
...
}
我獲得0結果
Luke正在使用StandardAnalyzer,這就是Explain Structure窗口的樣子:
必須手動爲每個搜索字段創建BooleanClause
對象,爲每個字段指定Should
然後將它們添加到BooleanQuery
對象.Add()
?我認爲QueryParser
會爲我做這個。我錯過了什麼?
編輯: 簡化一點點,docfile:Tomatoes*
路加福音23個返回文檔,但在我的應用程序0。每個基因的建議,我已經從MUST
改爲SHOULD
:
QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
BooleanQuery bquery = new BooleanQuery();
Query parsedQuery = parser.Parse(query);
bquery.Add(parsedQuery, Lucene.Net.Search.BooleanClause.Occur.SHOULD);
int _max = searcher.MaxDoc();
BooleanQuery.SetMaxClauseCount(Int32.MaxValue);
TopDocs hits = searcher.Search(parsedQuery, _max);
parsedQuery簡直是docfile:tomatoes*
EDIT2:
我想我終於讀懂了問題的根源:
QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
Query parsedQuery = parser.Parse(query);
在第二行中,query
是"docfile:Tomatoes*"
,但parsedQuery
是{docfile:tomatoes*}
。注意區別?分析後的查詢中的小寫't'。我從來沒有注意到這一點。如果我將IDE中的值更改爲「T」,則返回23個結果。
我驗證過索引和讀取索引時StandardAnalyzer
正在使用。如何強制queryParser
保持的query
值的情況下?
編輯3: 哇,多麼令人沮喪。按照documentation,我可以做到這一點:
parser.setLowercaseExpandedTerms(假);
無論通配符,前綴而言, 模糊和範圍查詢是是 自動小寫或沒有。 默認值爲true。
我不會認爲這是否是合理的默認值。我想SimpleAnalyzer應該被用來小寫索引中的所有內容。令人沮喪的是,至少在我使用的版本中,盧克默認了另一種方式!至少我學到了更多關於Lucene的知識。
什麼是變量「查詢」的示例值?另外,「bquery」的目的是什麼? – 2011-05-13 19:31:52
我會假設查詢是他正在搜索的字符串:docurl:www.siteurl.com docfile:番茄* – goalie7960 2011-05-13 20:28:25