2

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

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

4

2 回答 2

4

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

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

于 2010-05-12T12:06:13.247 回答
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 编辑距离的术语,然后搜索其中的任何术语。

于 2010-01-30T01:16:45.950 回答