问题背景:
集美中转场搜不到,集美可以搜到
测试步骤:
DELETE test22
PUT test22
{
"mappings": {
"properties": {
"locationName": {
"type": "text",
"fields": {
"raw":{
"type": "keyword",
"ignore_above": 256
}
},
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
}
GET test22/_analyze
{
"text": "集美中转场",
"tokenizer": "ik_max_word"
}
POST test22/_doc
{
"locationName": "集美中转场"
}
GET test22/_search
{
"query": {
"match_phrase": {
"locationName": "集美中转场"
}
}
}
排查复现:
profile分析看词元是包含集美中转场的
自定义词典中也加的有中转场和集美
测试词典中加集美中转场完整的词,是可以查询到的
但客户业务使用场景会有特别多的中转场查询需求,一个一个加词典不太现实,该如何处理?
原因分析:
一般查不出来就是因为里面有词对不上,因为match phase 的分词后是AND查询。测试数据就是 集美中转场,查询关键字也是 集美中转场,完全匹配上的
看起来跟这些词的顺序还有关系,match phrase 有顺序要求
从profile 看根因是
locationName:\"集美 中转场\" (smart 分词结果) 无法匹配 "locationName:\"集美 美中 中转场 中转 转场\""(max 分词结果)
因为(max 分词结果) 在 "集美 中转场\" 中间多了一个" 美中 "
加了slop:1 后,就允许(smart 分词结果)可以进行偏移,匹配方式变成 :\"集美 XXXX(1个偏移) 中转场\"
解决方案:
1.match_phrase查询时指定和analyzer一样的分词器就可以匹配到
2.使用match的方式,operator指定为AND,但是这种方式可能会多查到一些数据
比如 集美广州中转场 这种也会命中,因为match是无序的,只要ik_max_word中分出来的词包含查询语句中分出来的词就会命中
3、可以通过slop 调大顺序的兼容性
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。