在 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/

10-10 14:33