首页 > 解决方案 > 模糊匹配失败但精确匹配通过

问题描述

我一直在使用模糊匹配构建一个 ElasticSearch 查询来匹配系统中的用户。当针对特定的用户组(使用我的名字的用户)运行它时,查询似乎运行良好,但是当针对随机选择的用户运行它时,它似乎失败了。

出于测试的目的,我传递了特定用户的确切值,因此我希望至少有 1 个匹配项。

在缩小范围时,我发现exact与名称匹配会按预期返回数据,但是将相同的值放入模糊块会导致它返回 0 结果。

例如,此查询按预期返回用户记录:

{
    "from": 0,
    "size": 1,
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "firstName": {
                            "query": "sVxGBCkPYZ",
                            "boost": 30
                        }
                    }
                }
            ],
            "should": [

            ]
        }
    },
    "fields": [
        "id",
        "firstName"
    ]
}

但是,用以下内容替换match元素无法返回任何记录:

{
    "fuzzy": {
        "firstName": {
            "value": "sVxGBCkPYZ",
            "fuzziness": 2,
            "boost": 30,
            "min_similarity": 0.3
        }
    }
}

为什么会发生这种情况,我能做些什么来纠正这种情况?

以供参考。这是我目前使用的 ES 版本:

"version": {
    "number": "1.7.1",
    "build_hash": "b88f43fc40b0bcd7f173a1f9ee2e97816de80b19",
    "build_timestamp": "2015-07-29T09:54:16Z",
    "build_snapshot": false,
    "lucene_version": "4.10.4"
}

标签: elasticsearchfuzzy-search

解决方案


匹配失败,因为fuzzy searchesterm level queries意味着查询字符串不会被分析,而被索引的数据,我假设,如果类型text为 with standard analyzer,将在倒排索引中转换为svxgbckpyz 。

您可以改为fuzziness使用match如下查询实现:

POST testindex/_search
{  
   "query":{  
      "match":{  
         "firstname":{  
            "query":"sVxGBCkPYZ",
            "fuzziness":"AUTO"
         }
      }
   }
}

您可以根据您的用例将值从 更改AUTO2或更改。3

您提到的exact匹配也有效,因为查询字符串将被分析并将输入字符串转换为小写,这在倒排索引中可用。

至于模糊查询(您提到的)如何在幕后工作,根据这个LINK,如下:

模糊查询的工作原理是采用原始术语并构建一个 Levenshtein 自动机——就像一个表示原始字符串指定编辑距离内的所有字符串的大图。

然后,模糊查询使用自动机高效地遍历术语字典中的所有术语,以查看它们是否匹配。一旦它收集了术语字典中存在的所有匹配术语,它就可以计算匹配文档的列表。

当然,根据存储在索引中的数据类型,编辑距离为 2 的模糊查询可能会匹配到非常多的词条,并且性能很差。

特别注意这个声明,representing all the strings that are within the specified edit distance of the original string

例如,一些距离为 1 的单词life将是aife, bife, cife, dife....lifz

因此,在您的情况下,模糊搜索的自动机首先无法svxgbckpyz从输入字符串创建术语,sVxGBCkPYZ因为它们之间的距离为 7(请记住,A和之间的距离为 1 a)我认为AUTO选项无法创建,即使您将其配置为7,它可能不会创建字符串,因为会有大量带有距离的单词列表7

添加更多链接以获取更多信息。希望能帮助到你!


推荐阅读