elasticsearch - Elasticsearch 模糊查询
问题描述
我正在尝试进行应该像这样的模糊搜索
我有这样的索引
{
"test": {
"aliases": {},
"mappings": {
"properties": {
"first_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"last_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"settings": {
"index": {
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_content"
}
}
},
"number_of_shards": "1",
"provided_name": "test",
"creation_date": "1617623285742",
"number_of_replicas": "1",
"uuid": "MxSWoxSoS6y6x5Jdt2AvMQ",
"version": {
"created": "7120099"
}
}
}
}
}
在该索引内有一个数据
{
"first_name": "homo sapiens",
"last_name": "moho"
}
我试图像这样查询,但它不起作用
{
"query": {
"match": {
"first_name": {
"query": "hosan",
"fuzziness": "AUTO:0,0"
}
}
}
}
但如果我用“hoom”、“homoo”或“homos”搜索它就可以了。
有人可以帮我做这个模糊搜索吗?谢谢!
解决方案
对于由 5 个字符 (hosan) 组成的查询词,模糊度值auto
只会为您提供 1 的编辑距离值,这不足以让您从 hosan 到 homo。您可以实现的最大编辑距离值为auto
2,并且只有在查询词大于 5 个字符时才能实现。您可以强制使用 3 或 4 的模糊度值来尝试达到您想要的结果,但 ES 默认最大值为 2 的原因是因为更高的数字可能会开始产生意外和笨拙的结果。另请注意,您的其他搜索示例(hoom、homoo 等)仅匹配单词 homo。匹配查询默认为 OR 查询,并将返回任何匹配项的结果。
仅供参考,auto
对于长度为 1-2 个字符的查询词,将为您提供 0 编辑距离,为 3-5 个字符的查询词提供 1 个编辑距离,为大于 5 个字符的查询词提供 2 个编辑距离。
因此,我会将您的模糊度值提高 1,直到您在 hosan 上搜索时得到返回的结果,但这只是为了证明我在这里概述的内容。在任何生产环境中,我个人都不会超过 2 甚至 3 的模糊值。
推荐阅读
- javascript - 无法让 preventDefault 工作:item.preventDefault 不是函数
- docker - 在向上或向下扩展 StatefulSet 之前停止所有 Pod
- serverless-framework - 如何在 sls deploy 期间安装私有 npm github 包
- javascript - TestCafe - 如何检查断言中的值是否大于或等于
- python - 记录枚举类的困难?
- python-3.x - 我的对称差分函数没有返回,我不明白为什么
- android - 如何在 linux 上运行 android x86 so 文件?
- python - Python:验证信用卡数字
- c# - 绑定到 ListView 上的 ViewModel 什么都没有显示,但在其他控件上工作正常
- java - Java 不能在自己创建的私有 void 中工作,但是在执行按钮操作时它可以