在 Luke 中,以下搜索表达式返回 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 个结果
Luke 正在使用 StandardAnalyzer,这是“解释结构”窗口的样子:
我是否必须为我搜索的每个字段手动创建
BooleanClause
对象,为每个字段指定 Should
然后使用 BooleanQuery
将它们添加到 .Add()
对象中?我认为 QueryParser
会为我做这件事。我错过了什么?编辑:
稍微简化一下,
docfile:Tomatoes*
在 Luke 中返回 23 个文档,而在我的应用程序中返回 0 个。根据 Gene 的建议,我已将 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:
哇,多么令人沮丧。根据 documentation ,我可以通过以下方式完成此操作:
parser.setLowercaseExpandedTerms(false);
我不会争论这是否是合理的默认值。我想应该使用 SimpleAnalyzer 来小写索引内外的所有内容。令人沮丧的部分是,至少在我使用的版本中,卢克默认了另一种方式!至少我对 Lucene 有了更多的了解。
最佳答案
QueryParser
确实会接受诸如“docurl:www.siteurl.com docfile:Tomatoes*”之类的查询,并根据给定的查询(请参阅 query syntax )从中构建适当的查询( bool 查询、范围查询等)。
您的第一步应该是附加调试器并检查 parsedQuery
的值和类型。
关于c# - Luke Lucene BooleanQuery,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5996787/