我一直在使用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"
}
答案 0 :(得分:1)
匹配失败,因为fuzzy searches
是term level queries
,这意味着在被索引的数据为{{1}类型的情况下,将不分析查询字符串 }与text
一起使用,将在倒排索引中转换为 svxgbckpyz 。
您可以改为使用standard analyzer
查询来实现fuzziness
,如下所示:
match
您可以根据使用情况将值从POST testindex/_search
{
"query":{
"match":{
"firstname":{
"query":"sVxGBCkPYZ",
"fuzziness":"AUTO"
}
}
}
}
更改为AUTO
或2
。
您提到的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以获得更多信息。希望能帮助到你!