写在前面
测试环境测试新功能的时候发现一个问题,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
| 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}}}}}}';
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来匹配(当然可以设置一个单个分词器,这种需要再创建一开始就确定,没法中途修改)