2011-05-13 31 views
4

在路加福音,下面的搜索表達式返回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窗口的樣子: Luke Query 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的知識。

+0

什麼是變量「查詢」的示例值?另外,「bquery」的目的是什麼? – 2011-05-13 19:31:52

+0

我會假設查詢是他正在搜索的字符串:docurl:www.siteurl.com docfile:番茄* – goalie7960 2011-05-13 20:28:25

回答

1

QueryParser的確會採取類似的查詢「docurl:www.siteurl.com DOCFILE:西紅柿*」,並建立一個適當的查詢出來的依據給定的查詢它(布爾查詢,查詢範圍等)(見query syntax )。

您的第一步應該是附加調試器並檢查parsedQuery的值和類型。

+0

parsedQuery = docurl:www.toledoblade.com docfile:西紅柿*。所以它看起來像QueryParser正在做的事情。 – Dzejms 2011-05-16 12:09:34

+0

parsedQuery的類型是什麼?它應該是一個布爾查詢並且由兩個其他查詢組成(匹配你在Luke中看到的查詢結構)。兩個問題:1 - bquery的目的是什麼(它似乎沒有被使用)? 2 - 如果您使用另一種不同的搜索方法(其他重載之一),您會得到相同的結果嗎? – 2011-05-16 13:14:10

+0

你說得對bquery,我從來沒有注意到它沒有被使用。我沒有寫這個代碼。現在看看這個。 – Dzejms 2011-05-16 13:32:35

3

使用Occur.MUST等效於將+運算符與標準查詢解析器一起使用。因此你的代碼正在評估+docurl:www.siteurl.com +docfile:Tomatoes*,而不是你輸入Luke的表達式。要獲得該行爲,請在添加子句時嘗試Occur.SHOULD

+0

將Luke中的搜索表達式更改爲+ docurl:www.toledoblade.com + docfile:番茄*確實返回0個文檔。但是,將我的子句更改爲SHOULD似乎沒有相反的效果。 bquery.Add(parsedQuery,Lucene.Net.Search.BooleanClause.Occur.SHOULD);. hits.totalHits仍然爲0. – Dzejms 2011-05-16 12:17:14

+0

嘗試在'bquery'而不是'parsedQuery'上搜索,並且像下面提到的@ryan一樣,查看'parsedQuery'的類是什麼。逐步調試器中的代碼通常是有幫助的。 – 2011-05-16 15:54:52