【问题标题】:Search Lucene with precise edit distances使用精确的编辑距离搜索 Lucene
【发布时间】:2010-01-15 18:27:39
【问题描述】:

我想搜索具有编辑距离的 Lucene 索引。例如,假设有一个包含字段 FIRST_NAME 的文档;我想要所有名字与“约翰”相距 1 编辑距离的文档。

我知道 Lucene 支持模糊搜索 (FIRST_NAME:john~) 并采用 0 到 1 之间的数字来控制模糊性。问题(对我来说)是这个数字不能直接转化为编辑距离。当文档中的值是短字符串(少于 3 个字符)时,模糊搜索很难找到它们。例如,如果有一个带有 FIRST_NAME 'J' 的文档,我搜索 FIRST_NAME:I~0.0 我什么也得不到。

【问题讨论】:

    标签: lucene fuzzy-search


    【解决方案1】:

    在 Lucene 的 FuzzyQuery 中,您不能指定确切的距离。您可以指定介于 0 和 1 之间的“模糊性”值,其中接近 0 的值表示广泛匹配,接近 1 的值表示窄匹配。 “模糊性”的公式如下。 (来自 Lucene in Action)

    根据这个公式,您可以返回给定距离值的近似模糊度。所以StackOverflow要匹配StackUnderflow,距离为3,需要的模糊度约为0.77。

    【讨论】:

    • 查看 Lucene in Action 他们在第 93 页上的公式是 1 - distance / min(textlen, targetlen),但这不能完全正确,因为它允许小于 0.0 的值。在我的测试中,该公式实际上确实使用了min(textlen, targetlen)(与他们使用1 - distance / max(textlen, targetlen) 的LevensteinDistance 的实现不同),因此它们必须使返回的字符串无法返回比较短字符串的长度需要更多更改的字符串。
    【解决方案2】:

    如果您只需要 1 个编辑距离并且结果可以包含完全匹配,那么您可以在查询语言中使用单字符通配符。如果名字是

    john
    

    那么匹配它的查询和 1 个编辑距离内的任何术语看起来像

    ?john OR j?ohn OR jo?hn OR joh?n OR john? OR ohn OR jhn OR joh OR ?ohn OR j?hn OR jo?n OR joh?
    

    对于更复杂的情况,您可能需要获取索引中的术语列表(使用 IndexReader.term()),保留 1 编辑距离之外的术语,然后搜索其中的任何术语。

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多