elasticsearch - 模糊匹配失败但精确匹配通过
问题描述
我一直在使用模糊匹配构建一个 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"
}
解决方案
匹配失败,因为fuzzy searches
这term level queries
意味着查询字符串不会被分析,而被索引的数据,我假设,如果类型text
为 with standard analyzer
,将在倒排索引中转换为svxgbckpyz 。
您可以改为fuzziness
使用match
如下查询实现:
POST testindex/_search
{
"query":{
"match":{
"firstname":{
"query":"sVxGBCkPYZ",
"fuzziness":"AUTO"
}
}
}
}
您可以根据您的用例将值从 更改AUTO
为2
或更改。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
添加更多链接以获取更多信息。希望能帮助到你!
推荐阅读
- node.js - 将 React 应用程序的内容移动到另一个文件夹后出现 npm 启动错误
- python-camelot - 多页pdf上的不同table_areas
- python - 交互 Python 笔记本/组件的概念(例如,用于多智能体强化学习) - 类似 EJB-bean 的组件?
- python - TS SS 矢量相似度使用矩阵
- kotlin - 协程没有完成,因为它有一个与之关联的异步没有完成,如何独立运行异步?
- unity3d - Unity 错误 CS1503 将双精度转换为浮点
- python - 在Python中的列表中减去浮点值
- elasticsearch - 搜索引擎正确有效的 Elasticsearch 结构
- nuxt.js - 如何在 Nuxt 中为 .env 文件指定另一个目录或名称
- python - 我可以在没有 def total_numbers(number_set): 的情况下运行它,但不能使用它。为什么?