elasticsearch - Elasticsearch 模糊性并不总是匹配
问题描述
我们将弹性搜索用于 globalsearch 和 quicksearch,并具有通用配置。
globalsearch 能够搜索多种类型,而 quicksearch 只会查找一种类型(这是由通用组件使用的)。
quicksearch 应该搜索的类型之一称为workorder
. 我有几个工单,其中两个是这样存储的:
{
"_source": {
"name": "70187"
}
}
{
"_source": {
"name": "60255"
}
}
但是,我从模糊中得到了一些意想不到的行为:
- 当我搜索时
6025
,它可以匹配60255
。 - 当我搜索时
7018
,它无法匹配70187
我使用这个配置:
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"fields": [
"name",
"last_name",
"first_name"
],
"fuzziness": 1,
"max_expansions": 1,
"query": 6025,
"type": "most_fields"
}
},
{
"multi_match": {
"fields": [
"name",
"last_name",
"first_name"
],
"max_expansions": 1,
"query": 6025,
"type": "most_fields"
}
},
{
"multi_match": {
"fields": [
"content",
"description"
],
"max_expansions": 1,
"query": 6025,
"slop": 5,
"type": "best_fields"
}
},
{
"multi_match": {
"boost": 15,
"fields": [
"_id",
"reference",
"mobilenumber",
"phonenumber",
"batchnumber",
"number"
],
"max_expansions": 1,
"query": 6025,
"type": "best_fields"
}
}
]
}
}
}
为什么要这样做?我该如何解决?
编辑(1)
我忘了提到我正在运行 ElasticSearch 5.6。
编辑(2)
显然,仅凭我提到的两条记录,我就能很好地找到两个工单。我删除了我正在使用的索引。
在添加另外两个现有工单后,我仅用四条记录就能重现问题。
新增的两条记录是:
{
"name" : "70186"
}
{
"name" : "68012"
}
如果它很重要,这四个记录的 ID 是:
- 70186:9
- 70187:10
- 60255:11
- 68012:12
编辑(3)
重现步骤:https ://gist.github.com/DevMcC/fe890dcbcba806da8086c4811a0db776
解决方案
在 Elasticsearch fuzziness 中,您应该传递参数
"prefix_length":1 // 0,1,2...
创建扩展时保持不变的起始字符数。默认为 0。
模糊查询在指定的编辑距离内创建一组搜索词的所有可能变化或扩展。
在你的情况下 -
"fuzziness": 1,
GET /_search
{
"query": {
"fuzzy": {
"user.id": {
"value": "ki",
"fuzziness": "AUTO",
"max_expansions": 50,
"prefix_length": 0,
"transpositions": true,
"rewrite": "constant_score"
}
}
}
}
推荐阅读
- android-studio - Android Studio 3.2 gradle 同步按钮不见了
- linkedin - LinkedIn API:获取访问令牌时拒绝访问
- spring-boot - springboot websocket不起作用@Autowired
- php - PHP Mailchimp v3
- javascript - res.render sweetalert 在 ejs 文件上
- blockchain - Solidity: Error when calling a function of another contract. Error: The constructor should be payable when you send value
- css - Datatables lost sidebar
- entity-framework - Custom key with autoincrement
- function - 在地图上循环并使用值上的函数(SCSS)
- html - 带有伪元素的水平居中输入