C# 卢克·卢塞恩·布尔查询
在Luke中,以下搜索表达式返回23个结果:C# 卢克·卢塞恩·布尔查询,c#,lucene,lucene.net,luke,C#,Lucene,Lucene.net,Luke,在Luke中,以下搜索表达式返回23个结果: docurl:www.siteurl.com docfile:Tomatoes* 如果我使用以下实现将同一表达式传递到我的C#Lucene.NET应用程序中: IndexReader reader = IndexReader.Open(indexName); Searcher searcher = new IndexSearcher(reader); try {
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
,然后使用.add()
将它们添加到BooleanQuery
对象中吗?我以为QueryParser
会帮我做到这一点。我错过了什么
编辑:
简化一点,docfile:tomatos*
在Luke中返回23个文档,而在我的应用程序中返回0个。根据Gene的建议,我已经从必须
改为应该
:
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:tomatos*
Edit2:
我想我终于找到了根本问题:
QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
Query parsedQuery = parser.Parse(query);
在第二行,query
是“docfile:tomatos*”
,但是parsedQuery
是{docfile:tomatos*}
。注意到区别了吗?已解析查询中的小写字母“t”。我以前从未注意到这一点。如果我将IDE中的值更改为“T”,则返回23个结果
我已经验证了在索引和读取索引时正在使用StandardAnalyzer
。如何强制queryParser
保留query
值的大小写
Edit3:
哇,真令人沮丧。根据,我可以通过以下方式完成此任务:
setLowercaseeExpandedTerms(false)
通配符、前缀、,
模糊和范围查询将被删除
是否自动降下外壳。
默认值为true
我不会争辩这是否是合理的违约。我想应该使用SimpleAnalyzer将索引内外的所有内容都小写。令人沮丧的是,至少在我使用的版本中,Luke的默认设置是相反的!至少我对Lucene有了更多的了解
QueryParser
确实会接受类似“docurl:www.siteurl.com docfile:tomatos*”这样的查询,并根据给定的查询(请参阅)从中构建适当的查询(布尔查询、范围查询等)
第一步应该是附加一个调试器,并使用
occure检查parsedQuery
的值和类型。MUST
相当于将+
运算符与标准查询解析器一起使用。因此,您的代码计算的是+docurl:www.siteurl.com+docfile:tomatos*
,而不是您在Luke中键入的表达式。若要获得该行为,请尝试在添加子句时发生。应该。变量“query”的示例值是什么?还有,“bquery”的目的是什么?我假设query是他正在搜索的字符串:docurl:www.siteurl.com docfile:tomatos*parsedQuery=docurl:www.toledoblade.com docfile:tomatos*。看起来QueryParser正在做它的事情。parsedQuery的类型是什么?它应该是一个布尔查询,由另外两个查询组成(与您在Luke中看到的查询结构相匹配)。两个问题:1-bquery的目的是什么(它似乎根本没有被使用)?2-如果你使用另一种不同的搜索方法(其他重载之一),你会得到相同的结果吗?关于bquery,你是对的,我从来没有注意到它没有被使用。这不是我写的代码。现在看看这个。使用bquery
的原因是指定多个搜索词,此时必须/应该的区别将发挥作用。bquery
未用作indexsearch
的参数。将Luke中的搜索表达式更改为+docurl:www.toledoblade.com+docfile:tomatos*确实返回0个文档。然而,将我的子句更改为SHOULD似乎没有相反的效果。添加(parsedQuery,Lucene.Net.Search.BooleanClause.occure.SHOULD);。hits.totalHits仍然为0。请尝试在bquery'上搜索,而不是在parsedQuery上搜索,并且,正如@ryan在下面提到的,请查看parsedQuery`的类别。在调试器中单步执行代码通常很有帮助。