在路加福音,下面的搜索表达式返回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