用ES实现拼音搜索策略
构建拼音索引
Step 1 在ES中安装pinyin分词器
安装步骤详见网上的众多介绍,这里不赘述,「链接」。pinyin的开源见:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin.
Step 2 新建索引并初始化测试数据PUT idx_test_user { "mappings": { "dynamic": false, "properties": { "name": { "analyzer": "standard", "type": "text", "fields": { "pinyin": { "type": "text", "analyzer": "index_pinyin_analyzer" } } } } }, "settings": { "analysis": { "analyzer": { "index_pinyin_analyzer": { // MARK 1 "tokenizer": "index_pinyin_tokenizer" }, "search_pinyin_analyzer": { // MARK 2 "tokenizer": "search_pinyin_tokenzier" } }, "tokenizer": { "index_pinyin_tokenizer": { "keep_joined_full_pinyin" : "true", "lowercase" : "true", "none_chinese_pinyin_tokenize" : "false", "keep_none_chinese_in_joined_full_pinyin" : "true", "keep_original" : "true", "keep_none_chinese_together" : "true", "remove_duplicated_term" : "false", "keep_separate_first_letter" : "false", "type" : "pinyin", "limit_first_letter_length" : "16", "keep_full_pinyin" : "true" }, "search_pinyin_tokenzier": { "keep_joined_full_pinyin" : "true", "lowercase" : "true", "keep_original" : "true", "remove_duplicated_term" : "false", "keep_separate_first_letter" : "false", "type" : "pinyin", "limit_first_letter_length" : "16", "keep_full_pinyin" : "true" } } } } } POST idx_test_user/_doc/1 { "name": "李超" } POST idx_test_user/_doc/2 { "name": "李超越" } POST idx_test_user/_doc/3 { "name": "刘超" } POST idx_test_user/_doc/4 { "name": "李朝" }
代码示例 1.1
【MARK 1说明】analyzer根据使用的位置不同(索引侧、召回侧),有可能需要定义不同的analyzer,两侧的analyzer搭配在一起使用,共同构成一组搜索策略。MARK 1处为索引侧analyzer
【MARK 2说明】该analyzer用于召回侧,与MARK 1的analyzer组合在一起使用
索引侧analyzer效果说明
以代码示例1.1中的测试数据为例,在倒排索引中的结果是这样的
token
doc:李超
doc:李超越
doc:刘超
doc:李朝
li "start_offset" : 0,
"end_offset" : 0,
"position" : 0 "start_offset" : 0,
"end_offset" : 0,
"position" : 0
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0
李超 "start_offset" : 0,
"end_offset" : 0,
"position" : 0
-
-
-
lichao "start_offset" : 0,
"end_offset" : 0,
"position" : 0
-
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0
lc "start_offset" : 0,
"end_offset" : 0,
"position" : 0
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0 "start_offset" : 0,
"end_offset" : 0,
"position" : 0
chao "start_offset" : 0,
"end_offset" : 0,
"position" : 1 "start_offset" : 0,
"end_offset" : 0,
"position" : 1 "start_offset" : 0,
"end_offset" : 0,
"position" : 1 "start_offset" : 0,
"end_offset" : 0,
"position" : 1
李超越
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0
-
-
lichaoyue
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0
-
-
lcy
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0
-
-
yue
- "start_offset" : 0,
"end_offset" : 0,
"position" : 2
-
-
liu
-
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0
-
刘超
-
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0
-
liuchao
-
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0
-
李朝
-
-
- "start_offset" : 0,
"end_offset" : 0,
"position" : 0
表 1.1 「李超」、「李超越」、「刘超」在倒排索引中的结构
召回侧实现方式"match_phrase": { // MARK 1 "name.pinyin": { "analyzer": "search_pinyin_analyzer", // MARK 2 "query": "lichao" } }
代码示例 2.1
【MARK 1说明】注意要使用match_phrase,而不是match,不然会有badcase
【MARK 2说明】注意这里要指定召回侧的analyzer,analyzer声明详见「 代码示例 1.1」 ,若不指定则会用ES默认analyzer:standard
拼音搜索策略及其效果
使用代码示例1.1中提供的数据,倒排索引结构见表1.1,召回DSL见代码示例2.1
query
全拼
连字拼音
前缀拼音
多音字
lichao
李超,李朝
李超越
-
-
lichaoyue
李超越
-
-
-
li
-
李超,李超越,李朝
-
-
chao
-
李超,李超越,刘超,李朝
-
-
yue
-
李超越
-
-
liuchao
刘超
-
-
-
liu
-
刘超
-
-
lc
-
-
不支持
-
lizhao
-
-
-
不支持,无法召回李朝
表 2.1 各query在不同策略下可以召回的结果
欢迎访问我的博客:用ES实现拼音搜索策略 百木森森的技术分享
五大私募展望A股四季度市场有望企稳反弹,应积极布局多家私募表示,对目前我国经济基本面前景可继续保持乐观。从投资研判角度来看,A股市场长周期向上的逻辑未变,第四季度A股市场可能会逐步企稳反弹,投资者可积极逢低布局。第四季度市场有望企
加密货币波动性下降,美元市场仍然是加密行情涨跌的重要影响因素最近两天,加密货币行情波动明显降低,比特币24小时价格处于1921519544美元之间震荡,震荡幅度仅330美元,而以太坊则处于13031330美元区间震荡,震荡幅度更是低至27美
国庆7天,写了一个轻量级API框架前言有些项目是我们自己或者为朋友所开发的,功能比较简单,接口也比较少,但通常使用SpringBoot开发后,少说也得20M,传输部署也不方便,且这个jar中很可能有8090的代码是
抖音TIKTOK,不要混为一谈抖音有两个版本,国内版为抖音,国际版为TIKTOK,请不要将二者混为一谈。今天说说二者的区别。国内抖音内卷严重,闭环已经形成抖音面对国内用户,而TIKTOK则为国外用户。这个国外用
长白山森工集团对当前安全生产管理工作进行再部署日前,长白山森工集团召开2022年第四次安委会(扩大)会议。党委书记董事长崔光德主持会议并讲话,总裁王越传达了全国安全生产电视电话会议精神和省安委会2022年第五次全体会议精神。会
零陵微电影赤陵首发0000视频加载中剧情梗概赤陵(艺名),湖南零陵人,自小就在当地的戏班里面学习祁剧。与邻家哥哥(秋伢子)两小无猜,青梅竹马。因战争,秋伢子跟随父母,远离家乡。临行前,找到赤陵塞给她
河北首个!燕山大学获批国家自然科学基金基础科学中心项目近日,由燕山大学田永君院士牵头申报的国家自然科学基金基础科学中心项目材料高压调控正式获批立项,项目直接经费资助6000万元,这是该校首次获批该项目,也是河北省的一项重大历史性突破。
奉城又一项目落地开工!预计投资超6亿,用地45。6亩9月底,小方制药外用药生产基地新建项目开工建设,项目位于奉城镇2005C号地块,东至神州路,南至成凯路,西至空地,北至上海泰昌健康科技股份有限公司。该项目预计总投资6。6亿元,用地
10月10日起晋中市榆次老城景区实行景区门票免费政策黄河新闻网晋中讯(记者李炳仪)为回馈广大游客一直以来对榆次老城景区的喜爱和关注,榆次老城景区积极响应山西文旅号召,决定从2022年10月10日起,面向全国游客实行免门票政策(国内中
到过灵隐寺的人,知道隐字真谛的有多少?千年古刹灵隐寺,藏于西湖岸边的一座山丘上。四围皆是郁郁葱葱高矮不等的茶树与各色绿植,其中不乏千年以上的名贵稀有古木。南朝四百八十寺,多少楼台烟雨中。沿着龙井路驱车前行。待进入灵隐寺
投资2亿元!黄石人又将有休闲新去处据黄石公共资源交易网消息投资约2亿元!黄石市孙家湾城中村整治更新改造项目进入招标阶段很快就能和广大市民见面啦黄石市孙家湾城中村整治更新改造项目位于黄石市下陆区团城山商圈桂林北路以东