模糊匹配失败,但精确匹配通过

时间:2018-10-23 15:28:11

标签: elasticsearch fuzzy-search

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

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

在缩小范围时,我发现与名称的exact匹配将按预期返回数据,但是将 same 值放入模糊块会使它返回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"
}

1 个答案:

答案 0 :(得分:1)

匹配失败,因为fuzzy searchesterm level queries,这意味着在被索引的数据为{{1}类型的情况下,将不分析查询字符串 }与text一起使用,将在倒排索引中转换为 svxgbckpyz

您可以改为使用standard analyzer查询来实现fuzziness,如下所示:

match

您可以根据使用情况将值从POST testindex/_search { "query":{ "match":{ "firstname":{ "query":"sVxGBCkPYZ", "fuzziness":"AUTO" } } } } 更改为AUTO2

您提到的3匹配项也可以使用,因为将对查询字符串进行分析并将输入字符串转换为小写形式,该形式在反向索引中可用。

根据LINK,关于模糊查询(您已经提到)如何在幕后工作如下:

  

模糊查询通过采用原始术语并建立一个   Levenshtein自动机-像代表所有字符串的大图   在原始字符串的指定编辑距离之内。

     

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

     

当然,取决于存储在索引中的数据类型,   编辑距离为2的查询可以匹配非常多的   表现很差。

请特别注意以下声明,exact

例如representing all the strings that are within the specified edit distance of the original string中距离为1的某些单词为life

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

再添加一个LINK以获得更多信息。希望能帮助到你!