- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 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*
编辑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/
假设我们有以下 Lucene 查询: +(f1:x f2:x) +f3:y 这意味着结果必须在字段“f1”或字段“f2”中包含值“x”并且字段“f3”必须包含值“y”; 在旧版本的 Lucene 中,
我正在尝试将一个 BooleanQuery 嵌套在另一个 BooleanQuery 中。 使用以下代码创建内部 BooleanQuery 并将其添加到 topBQuery。 BooleanQu
像这样的类别树: root_1 sub_1 sub_2 ... to sub_20 每个文档都有一个子类别(如 sub_2)。现在,我只在lucene索引中写了sub_2: new Num
我在 lucene 中搜索一个“等于”运算符,实现如下: return new TermQuery(new Term(getName(), getValue())); 对于这样的值:customerI
在 Luke 中,以下搜索表达式返回 23 个结果: docurl:www.siteurl.com docfile:Tomatoes* 如果我使用以下实现将相同的表达式传递到我的 C# Lucene
如果整个查询没有返回结果,我需要确定 Lucene BooleanQuery 的哪一部分失败。 我使用的是由 4 个 NumericRangeQueries 和一个 PhraseQuery 组成的 B
大家好,我有一个问题:) 我像这样创建一个 BooleanQuery : BooleanQuery.Builder qry = new BooleanQuery.Builder(); qry.add(
我正在使用 Hibernate Search/Lucene 维护一个非常简单的索引来按名称查找对象——没有花哨的东西。 我的模型类都扩展了一个类NamedModel,它基本上如下所示: @Mapped
我创建了一个示例 Lucene 代码片段,它索引一个小文件。我能够正确执行索引并搜索单个字段值。但是,我想查询多个字段。我正在使用 BooleanQuery ,但它不工作。 有人可以建议吗?这是我的代
一个Document是一家公司的员工数据,具有多个字段名称,例如:empName、empId、departmentId 等。 使用自定义分析器已对大约 400 万条数据建立了索引。 搜索查询有一个 l
int length3 = CheckBoxList4.Items.Count; int count = 0; for (int i = 0; i < length3; i++) {
如何在 Lucene 6.x 中实例化 BooleanQuery?如何使用 boolean 查询在其中添加其他查询? 在 Lucene 4.x 中,我们使用 BooleanQuery 如下:
为什么在 Lucene.net 上使用 BooleanQuery 时第一个查询有效而第二个查询无效? 这是在 SHOPPING 字段上编入索引的示例: Shoes for sale Great bar
我观察到一种奇怪的行为,但我不知道我做错了什么。 我通过多个 BooleanQueries 创建了以下查询: +(-(Request.zipCode:18055 Request.zipCode:333
我几乎是 lucene 的新手,正在尝试对一些查询进行 AND 运算并显示它们。我搜索了整个网络,但找不到解决此问题的正确方法。 boolean 查询搜索的解决方案包括BooleanQuery Luc
我是一名优秀的程序员,十分优秀!