2011-05-13 47 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