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

x7rlezfr  于 2022-11-07  发布在  Lucene
关注(0)|答案(2)|浏览(204)

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

lo8azlld

lo8azlld1#

在Lucene的FuzzyQuery中,你不能指定确切的距离。你可以指定0到1之间的“模糊性”值,其中值越接近0表示宽匹配,值越接近1表示窄匹配。“模糊性”的公式如下。(摘自Lucene in Action)

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

o8x7eapl

o8x7eapl2#

如果只需要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个编辑距离的术语保留下来,然后搜索这些术语中的任何一个。

相关问题