【问题标题】:Using Lucene Fuzzy search with a word that has no aliases对没有别名的单词使用 Lucene 模糊搜索
【发布时间】:2026-02-07 17:40:01
【问题描述】:

我希望使用模糊搜索进行搜索。使用Luke 来帮助我,如果我搜索一个有别名的单词(例如相似的单词),它都会按预期工作:

但是,如果我输入的搜索词没有任何相似的词(例如序列号),搜索将失败并且我没有得到任何结果,即使它应该是有效的:

我是否需要以不同的方式来组织我的搜索?为什么我在第二次搜索中得到的结果与第一次不同,但只有一个“术语”?

【问题讨论】:

    标签: lucene luke


    【解决方案1】:

    您没有指定 Lucene 版本,所以我假设您使用的是 6.x.x。 您看到的行为是 Lucene Fuzzy Search 的正确行为。

    参考this,我引用,

    此查询最多匹配 2 次编辑的字词。

    这粗略但不是很准确意味着如果使用FuzzyQuery,则在任何位置最多两个字符的两个文本将作为匹配返回。

    下面是我在此处说明的一个简单 Java 程序的示例输出,

    假设三个索引文档有一个字段,其值如下 - “123456787”、“123456788”、“123456789”(附加 7、8 和 9 到 – 12345678)

    结果:

    未找到搜索字符串的命中 -> 123456(编辑距离 = 3,最后 缺少 3 位数字)

    找到 3 个文档!对于搜索字符串 -> 1234567(编辑距离 = 2)

    找到 3 个文档!对于搜索字符串 -> 12345678(编辑距离 = 1)

    找到 1 个文档!对于搜索字符串-> 1236787(编辑距离 = 2 找到一个,缺少 4 、 5 和剩余两个文档的最后一位)

    未找到搜索字符串的命中 -> 123678789(编辑距离 = 4, 缺少 4 、 5 和最后两位)

    所以您应该阅读更多关于编辑距离的内容。

    如果您的要求是匹配 N 个连续字符而不担心编辑距离,那么N-Gram Indexing using NGramTokenizer 是您的最佳选择。

    更多关于N-Gram的信息,请参见这里

    【讨论】:

    • 抱歉没有早点回来。 Luke 使用 Lucene 3.5。