我想用编辑距离搜索Lucene索引。例如,有一个包含字段FIRST_NAME的文档;我希望所有文件的名字距离一个编辑距离,例如'john'。
我知道Lucene支持模糊搜索(FIRST_NAME:john~)并使用0到1之间的数字来控制模糊性。问题(对我来说)是这个数字不直接转换为编辑距离。当文档中的值是短字符串(少于3个字符)时,模糊搜索很难找到它们。例如,如果有一个FIRST_NAME'J'的文档,我搜索FIRST_NAME:I~0.0我没有收到任何回复。
答案 0 :(得分:4)
在Lucene的FuzzyQuery中,您无法指定extact距离。您可以在0和1之间指定“模糊”的值,其中接近0的值表示广泛匹配,而接近1的值表示窄匹配。 “模糊性”的公式如下。 (来自Lucene in Action)
从这个公式中,您可以回到给定距离值的近似模糊性。因此,StackOverflow
与StackUnderflow
匹配,距离为3,所需的模糊度约为0.77。
答案 1 :(得分:1)
如果您只需要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的编辑距离,并搜索任何这些术语。