在卢克中,以下搜索表达式返回23个结果:
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的结果
卢克使用的是StandardAnalyzer,这就是解释结构窗口的样子:

必须手动为搜索的每个字段创建BooleanClause对象,为每个字段指定Should,然后使用.Add()将它们添加到BooleanQuery对象中?我以为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值的情况
Edit3:哇,多么令人沮丧。根据文档,我可以通过以下方法来完成这一任务:
Parser.setLowercaseExpandedTerms(假);
无论通配符、前缀、模糊查询和范围查询的术语是否自动小写.默认值是真的。
我不会争论这是否是一个明智的违约。我认为SimpleAnalyzer应该被用于小写索引内外的所有内容。令人沮丧的是,至少在我使用的版本中,卢克默认是另一种方式!至少我对Lucene了解得更多了。
发布于 2011-05-13 20:33:46
QueryParser确实将接受一个类似于"docurl:www.siteurl.com docfile:西红柿*“的查询,并利用它构建一个适当的查询(布尔查询、范围查询等)。取决于所提供的查询(请参见查询语法)。
您的第一步应该是附加调试器并检查parsedQuery的值和类型。
发布于 2011-05-15 06:00:53
使用Occur.MUST相当于在标准查询解析器中使用+操作符。因此,代码计算的是+docurl:www.siteurl.com +docfile:Tomatoes*,而不是输入到路克中的表达式。要获得这种行为,在添加子句时尝试Occur.SHOULD。
https://stackoverflow.com/questions/5996787
复制相似问题