lucene.net - Lucene 中的查询类型

标签 lucene.net lucene

Lucene NOOB 警报!

我认为自己是一个至少具有合理智力的人,但是我在头脑中摸索 Lucene 中的查询类型时遇到了巨大的问题。

在我的特定实例中,我需要在文档中搜索长度适中的单个字符串字段(平均大约 50 个字符)。

我希望用户能够在他们正在搜索的项目中键入单词的开头。而且我也不想规定他们提供条款的顺序。

示例字段:“通用品牌强度”

应匹配搜索: “通用品牌实力” “品牌通用强度” ... “根麸str” “麸皮通用str” ... 等等

如果有帮助的话,我可以将我的信息(示例中的每个单词)存储在单独的字段中,但我不相信会这样。

我目前迷失在模糊通配符和多术语短语的世界中。

有人能为我澄清整个情况吗? (是的,我在网上广泛寻求帮助,但找不到合适的资源)。

顺便说一句,我正在使用 Lucene 2.9,但我认为这并不重要。

最佳答案

您无需将每个术语存储在单独的字段中。 Lucene 从每个术语中创建标记(如果您使用空白标记生成器),因此允许搜索的极大灵活性。

关于您的问题:

Example field : "generic brand strength"

Should match searches : "generic brand strength" "brand generic strength"

上面的查询将返回两个结果,由于显而易见的原因,后者的分数较低。然而,“gen bran str”“bran generic str”...等很棘手,因为这些术语似乎不是标准的“词干”,在这种情况下您可以使用词干分析器。

最简单的方法是:

  1. 用空格分割查询短语,这样就有一个字符串[]
  2. 使用 bool 查询并为每个术语创建一个查询,并在末尾附加通配符。

类似于:

string[] terms = query.split(" ");
BooleanQuery bq = new BooleanQuery();

foreach(string term in terms)
 bq.Add(new Query("FieldName", term + "*",...);

还有更好的查询类型,例如 SpanQuery、DisMax 等,但既然您提到了菜鸟警报,请认为上述是最简单的(尽管可能不是最优雅的)方法。

HTH

关于lucene.net - Lucene 中的查询类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358749/

相关文章:

lucene - 在 Lucene.net 中使用日期范围

TokenStream 中存储值的 Lucene 字段

ruby-on-rails - 如何防止 cucumber 特征测试影响发育中的 Elasticsearch 指数?

java - 索引文档

c# - 在 Lucene.net 中,我想在同一个方面类别中执行 AND 但似乎没有简单的方法可以做到这一点

c# - Lucene:查找最接近的数字

java - Apache SOLR 和字符串范围搜索

java - 如何在 Lucene 中覆盖单个字段中的相似性?

c# - Lucene AddIndexes(合并)——如何避免重复?

elasticsearch - Elasticsearch中滚动索引的资源使用情况