目录
背景:
Es 版本:
第一步
第二步 (错误步骤 - 只是记录过程)
第三步
第四步
第五步
第六步
第七步
背景:
app 原有的搜索功能无法进行拼音搜索,产品希望可以支持,例如内容中含有:中国通史记,那不管搜 `通史` or `tongshi`,都可以搜到这个内容
Es 版本:
6.4.0
第一步
确定es目前是否支持pinyin的搜索能力,没有的话需要下载相关组件,下载这里不做介绍
可执行以下命令确定:
POST /_analyze
{"analyzer": "pinyin","text": "中国通史"
}
正常得到以下结果:
{"tokens": [{"token": "zhong","start_offset": 0,"end_offset": 0,"type": "word","position": 0},{"token": "zgts","start_offset": 0,"end_offset": 0,"type": "word","position": 0},{"token": "guo","start_offset": 0,"end_offset": 0,"type": "word","position": 1},{"token": "tong","start_offset": 0,"end_offset": 0,"type": "word","position": 2},{"token": "shi","start_offset": 0,"end_offset": 0,"type": "word","position": 3}]
}
第二步 (错误步骤 - 只是记录过程)
新增索引字段,例如:content_pinyin, analyzer为:pinyin
PUT /index/_mapping/_doc
{"properties": {"content_pinyin": {"type": "text","analyzer": "pinyin"}}
}
第三步
同步数据,将原content的文档数据同步给content_pinyin, 同步方式可参考 (生产环境要考虑数据量的问题,否则影响线上业务,数据过大建议使用脚本进行数据刷新):
POST /index/_update_by_query
{"script": {"source": "ctx._source.content_pinyin = ctx._source.content","lang": "painless"},"query": {"match_all": {}}
}
第四步
使用新字段进行搜索,结果如下:
搜索结果没有问题,但是会发现,高亮字段竟然是整个内容:
第五步
参考此文章:【精选】ElasticSearch7.6.2 拼音,中文,中音搜索,高亮搜索关键字_es 中文和拼音搜索-CSDN博客
找到了答案
需要修改索引设置,新增自定义分析器和过滤器来实现高亮
# 要先临时关闭索引
POST /index/_close# 修改索引设置
PUT /index/_settings
{"settings": {"analysis": {"analyzer": {"ik_pinyin_analyzer": {"tokenizer": "my_pinyin"}},"tokenizer": {"my_pinyin": {"type": "pinyin","keep_full_pinyin": true,"keep_original": false,"limit_first_letter_length": 10,"lowercase": true,"remove_duplicated_term": false,"ignore_pinyin_offset": false,"keep_first_letter": true,"keep_separate_first_letter": true}}}}
}# 打开索引
POST /bm_ebook/_open
这里如果在线上操作,可能会导致一段时间的服务不可用,顺利的话大概五秒左右,如果能接受可以直接执行,不行的话只能新建索引,然后刷一遍数据
第六步
新建字段 (因为es不允许修改已经生效的字段的分析器,所以我只能再新建一个字段)
PUT /index/_mapping/_doc
{"properties": {"ik_content_pinyin": {"type": "text","analyzer": "ik_pinyin_analyzer"}}
}
这里分析器使用刚刚新增的自定义分析器: ik_pinyin_analyzer
然后同第三步,同步一下数据内容
第七步
通过新字段来进行拼音搜索,结果如下: