首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >路克·卢塞尼BooleanQuery

路克·卢塞尼BooleanQuery
EN

Stack Overflow用户
提问于 2011-05-13 19:27:01
回答 2查看 2.4K关注 0票数 4

在卢克中,以下搜索表达式返回23个结果:

代码语言:javascript
复制
docurl:www.siteurl.com  docfile:Tomatoes*

如果我将相同的表达式传递到我的C# Lucene.NET应用程序中,下面的实现如下:

代码语言:javascript
复制
        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的结果

卢克使用的是StandardAnalyzer,这就是解释结构窗口的样子:

必须手动为搜索的每个字段创建BooleanClause对象,为每个字段指定Should,然后使用.Add()将它们添加到BooleanQuery对象中?我以为QueryParser会为我做这件事。我遗漏了什么?

编辑:简化了一小部分,docfile:Tomatoes*在卢克中返回23个文档,在我的应用程序中返回0。根据吉恩的建议,我已经从MUST变成了SHOULD

代码语言:javascript
复制
            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:

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

代码语言:javascript
复制
            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:哇,多么令人沮丧。根据文档,我可以通过以下方法来完成这一任务:

Parser.setLowercaseExpandedTerms(假);

无论通配符、前缀、模糊查询和范围查询的术语是否自动小写.默认值是真的。

我不会争论这是否是一个明智的违约。我认为SimpleAnalyzer应该被用于小写索引内外的所有内容。令人沮丧的是,至少在我使用的版本中,卢克默认是另一种方式!至少我对Lucene了解得更多了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-13 20:33:46

QueryParser确实将接受一个类似于"docurl:www.siteurl.com docfile:西红柿*“的查询,并利用它构建一个适当的查询(布尔查询、范围查询等)。取决于所提供的查询(请参见查询语法)。

您的第一步应该是附加调试器并检查parsedQuery的值和类型。

票数 1
EN

Stack Overflow用户

发布于 2011-05-15 06:00:53

使用Occur.MUST相当于在标准查询解析器中使用+操作符。因此,代码计算的是+docurl:www.siteurl.com +docfile:Tomatoes*,而不是输入到路克中的表达式。要获得这种行为,在添加子句时尝试Occur.SHOULD

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5996787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档