Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 卢克·卢塞恩·布尔查询_C#_Lucene_Lucene.net_Luke - Fatal编程技术网

C# 卢克·卢塞恩·布尔查询

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 {

在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
,然后使用
.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`的类别。在调试器中单步执行代码通常很有帮助。