使用精确的编辑距离搜索Lucene

使用精确的编辑距离搜索Lucene,lucene,fuzzy-search,Lucene,Fuzzy Search,我想用编辑距离搜索Lucene索引。例如,假设有一个字段名为的文档;我希望所有文件的名字都与“john”保持1编辑距离 我知道Lucene支持模糊搜索(名字:john~),并使用0到1之间的数字来控制模糊性。问题是(对我来说)这个数字不能直接转换为编辑距离。当文档中的值是短字符串(少于3个字符)时,模糊搜索很难找到它们。例如,如果有一个名为“J”的文档,我搜索名为:I~0.0,我不会得到任何回复 如果只需要1个编辑距离,并且结果可以包含精确匹配,则可以在查询语言中使用单字符通配符。如果名字是 j

我想用编辑距离搜索Lucene索引。例如,假设有一个字段名为的文档;我希望所有文件的名字都与“john”保持1编辑距离


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

如果只需要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?

对于更复杂的情况,您可能需要在索引中获得一个术语列表(使用),将距离为1的术语保留在编辑距离之外,然后搜索这些术语中的任何一个。

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


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

从Lucene的实际情况看,他们在第93页的公式是
1-距离/分钟(textlen,targetlen)
,但这不能完全正确,因为它允许小于0.0的值。在我的测试中,该公式实际上使用了
min(textlen,targetlen)
(与LevensteinInstance的实现不同,LevensteinInstance使用
1-distance/max(textlen,targetlen)
),因此它们必须使返回的字符串不可能比较短字符串的长度需要更多的更改。