【问题标题】:Lucene - Querying multiple terms in a fieldLucene - 查询字段中的多个术语
【发布时间】:2016-03-03 07:33:41
【问题描述】:

为简单起见,请考虑具有以下字段和值的两个文档:

RecordId: "12345"
CreatedAt: "27/02/1992"
Event: "Manchester, Dubai, Paris"
Event: "Manchester, Rome, Madrid"
Event: "Madrid, Sidney"


RecordId: "99999"
CreatedAt: "27/02/1992"
Event: "Manchester, Barcelona, Rome"
Event: "Rome, Paris"
Event: "Milan, Barcelona"

是否可以在“事件”字段的单个实例中搜索多个术语?

假设我想搜索“曼彻斯特”和“巴黎”以出现在同一字段中。 第二条记录包含“Manchester”和“Paris”,但在 Event 字段的不同实例上,这不应该是结果集的一部分。

理想情况下,结果集只是第一条记录 (12345)。

【问题讨论】:

  • 嘿,鹈鹕。可能为每个 Event 字段索引每条记录 (RecordID) 一次,并为每个 Event 字段加上 RecordID 的后缀。在您的示例中,您将有六个索引 12345-1。 12345-2。 12345-3 等。您最终会得到一个更大的索引,并且您需要过滤掉重复的命中(例如,如果您还有一个“曼彻斯特、底特律、巴黎”事件),但我认为它会起作用.
  • 我明白你的意思,但从长远来看,这种方法最终会让我做噩梦。不过,它会起作用。
  • 是的,我没有将其作为正式答案,因为它看起来很笨拙,即使它会起作用。如果您采用这种方法,请告诉我。
  • @MichaelGorsich 只是为了跟进您的评论,您将如何在运行时对这些字段执行搜索,而不知道它们的名称值。 (例如 12345-1、12345-2、12345-3 等)?
  • 在您的示例中,加上我第一条评论中的示例,“曼彻斯特”和“巴黎”的结果将为您提供 12345-1 和 12345-4。您最初会累积所有结果,然后去掉后缀 (LastIndexOf()) 并消除重复项以将结果减少到 12345,因此最终得到一个结果,您可以使用它来检索文档。

标签: lucene lucene.net


【解决方案1】:

取决于您用于该字段的分析器(它需要标记并删除标点符号)。你可以使用一个俚语查询。

"manchester paris"~2 应该只找到 12345。根据每个字段中值的数量和顺序,您可能需要使用更大的斜率。

slop 定义了短语上允许匹配的“操作”数。这可以是短语中的重新排序或附加术语。

所以 "x y"~1 可以匹配

  • “y x”
  • "x 弗雷德 y"
  • 但不是“y fred x”(这需要两个操作:swamp 加上一个加法)

根据您的需要,斜率可能应该等于字段中允许的最大术语数。我还没有完成,但我认为即使您查询超过 2 个术语也足够了。

【讨论】:

  • 我不知道废话查询。那么,2 步的 slop 查询会以任何给定的顺序查找在同一字段中包含术语“manchester”和“paris”的所有记录?
  • 简短回答:是的,正确我已经更新了答案,更多关于 slop 的作用
  • 对于没有设置最大术语数的字段,将 slop 设置为 int.MaxValue 会不会有点矫枉过正?
  • 它会工作的。但不推荐。城市的数量不是无限的 :) 对需求的一点分析应该会提出一个合理的上限。我假设这来自一些数据集。您可以旋转它以查看最大数量吗?然后添加一些容差。
【解决方案2】:

如何将 Event 索引为非标记化字段,然后为其使用 KeywordAnalyzer。然后,您可以使用 Lucene 的 Regex query 来匹配曼彻斯特和巴黎的出现:

Event: "/^.*(Manchester).+(Paris).*$/"

【讨论】:

  • 当前版本的 lucene.net(基于 3.0.3)中不提供正则表达式查询
  • Regex 查询在 4.0 之前(Lucene Java)之前很慢,但在 v4.0+ 中,Regex 查询是使用动态构造的自动机执行的,因此速度要快得多。如果您使用的是 .NET,我建议您使用 FlexLucene(最新 Lucene Java 的基于 IKVM 的端口),而不是 Lucene.NET。
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多