gpt4 book ai didi

c# - Luke Lucene BooleanQuery

转载 作者:太空狗 更新时间:2023-10-30 01:25:56 24 4
gpt4 key购买 nike

在 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,解释结构窗口如下所示: Luke Query Structure

我必须为我搜索的每个字段手动创建 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*

编辑2:

我想我终于找到了根本问题:

            QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
Query parsedQuery = parser.Parse(query);

在第二行,query"docfile:Tomatoes*",但是parsedQuery{docfile:tomatoes*} 。注意到区别了吗?已解析查询中的小写字母“”。我以前从来没有注意到这一点。如果我将 IDE 中的值更改为“T”,将返回 23 个结果。

我已经验证在索引和读取索引时正在使用 StandardAnalyzer。如何强制 queryParser 保留 query 值的大小写?

编辑 3:哇,多么令人沮丧。根据documentation ,我可以通过以下方式完成此操作:

parser.setLowercaseExpandedTerms(false);

Whether terms of wildcard, prefix, fuzzy and range queries are to be automatically lower-cased or not. Default is true.

我不会争论这是否是一个明智的默认设置。我想应该使用 SimpleAnalyzer 将索引内外的所有内容小写。令人沮丧的是,至少在我使用的版本中,Luke 默认采用另一种方式!至少我对 Lucene 有了更多的了解。

最佳答案

使用Occur.MUST 等同于在标准查询解析器中使用+ 运算符。因此,您的代码正在评估 +docurl:www.siteurl.com +docfile:Tomatoes* 而不是您在 Luke 中输入的表达式。要获得该行为,请在添加子句时尝试 Occur.SHOULD

关于c# - Luke Lucene BooleanQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5996787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com