learn and grow up

es模糊搜索的注意点

字数统计: 449阅读时长: 1 min
2020/11/22 Share

写在前面

​ 测试环境测试新功能的时候发现一个问题,es搜索的模糊搜索使用部分字段搜索不到指定的记录,如使用条件”2_“搜索不出来”2_test“的记录出来

正文

​ 观察代码发现使用的是match_phrase,搜索语句如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"query": {
"bool": {
"must": [
{
"term": {
"deleted": {
"value": 0,
"boost": 1
}
}
},
{
"match_phrase": {
"templateName": {
"query": "2_",
"slop": 0,
"boost": 1
}
}
}
],
"disable_coord": false,
"adjust_pure_negative": true,
"boost": 1
}
}
}

​ 按照之前的经验,match_phrase是通过对字段分词后的结果进行搜索,所以怀疑是分词的问题,使用接口查询该字段的分词结果如下:

1
/iiap_impl_index_template_group/iiap_impl_type_template_group_info/p2pZBHYBLdzsWUkgneXl/_termvectors?fields=templateName

分词结果

可以看到分词器将”2_test”列为一个完整的单词,所以无论使用什么方法不管是math还是match_phrase甚至wildcard都无法搜索出来,

​ 按照之前经验,为该字段在线添加一个keyword属性,让它不被分词,从而再使用wildcard的模糊匹配就可以搜索出来,脚本如下:

1
2
3
4
5
#添加keyword字段
curl -X PUT "http://106.52.89.117:19200/iiap_impl_index_template_group/_mapping/iiap_impl_type_template_group_info?pretty" -H "Content-Type:application/json" -d '{"iiap_impl_type_template_group_info": {"properties":{"templateName":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}}}}}';

#刷新keyword
curl -X POST "http://106.52.89.117:19200/iiap_impl_index_template_group/iiap_impl_type_template_group_info/_update_by_query?pretty" -H "Content-Type:application/json" -d '{"query":{"match_all":{}},"script":{"inline":"ctx._source.templateName = ctx._source.templateName","params":{"categoryName":"网关","categoryValues":",4,"}}}';

问题解决~

所以以后在es索引时需要注意:半路需要这种全局模糊搜索的,不想大改的话,就可以设置一个keyword字段,然后用wildcard来匹配(当然可以设置一个单个分词器,这种需要再创建一开始就确定,没法中途修改)

CATALOG
  1. 1. 写在前面
  2. 2. 正文