用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实现拼音搜索策略 百木森森的技术分享
万般皆是命夫妻的缘分,是有定数的01hr俗话说万般皆是命,半点不由人。人生路上,很多事情是可控的,也有很多事情,是不可控的。比方说,跨越了很多座城市,走了几千里路,然后在茫茫人海,遇到了另一个人。不知为何,彼此相
改变自己来源人民日报改变思维很多时候,我们容易陷入一种思维惯性,总是用过去的方法去解决现在的问题。同一个问题,有的人可以很快找到答案,有的人花了几天也没有头绪,这可能就是因为思维方式不同。
秋日限定文案1这世间美好的东西不多,初秋时节醉人的黄昏,和笑起来要人命的你。2初秋总是温柔,日间把夏天留下,日落后还带秋风。3密密初秋雨,蒙蒙欲暮天。牛羊争欲下,车马敢求前。蟋蟀挑孤咏,梧桐搅
奇葩的美女哲学是不是给出的爱越多,爱你的人就越少?是不是给出的爱越多,爱你的人就越少?想爱你的人很多,是不是,只需要给点诱惑和压力就可以了?简单地认为给出爱就可以让人爱你,这很幼稚。爱别人的时候,要注意自爱。否则的话,别人怎么会感
夏天更要出出汗春夏秋冬是自然造化,是天道运行。春暖花开夏热流火秋叶飘零冬雪纷飞,这样的四季轮回是每个人的人生旅途上必须直面的。但现在,随着风扇空调等清凉器具不断增加,不少人就习惯于一到夏天,就躲
挑战自我,超越梦想我感谢那天,因为这,让我们真正懂得了什么是团结的力量。那天是九月十八日,一个特殊的日子,一个最后考验我们的日子,天朗气清,惠风和畅,在三营五连齐声高呼加油之后,我们共同迈着整齐的步
人民日报金句摘抄09131。那些在别人看不见的地方也自律的人,真的连老天都不忍辜负。请相信在暗处执着生长,终有一日馥郁传香。2。当你不再轻易受外界干扰开始独立思考时,你就不会被星座催眠,更不会把信仰交给星
有格局的人,朋友圈都是怎样的点上方听一禅第1897次和你说晚安文一禅主播一禅很喜欢这样一句话你要学着做一个有温度且睿智的人,万物不为你所有,但要万物皆为你所用。不相为谋,你照样能心平气和,冷眼相待,你依旧可以
三甲医生自曝工资才1元,多人表示被降薪一个医学博士辛辛苦苦一个月还有值班,但工资只有8k,还有不到5k的。第二个,后勤绩效1。0,外科医生的绩效反而只有中位数?甚至有上个月工资为负数的?最后,院方还把这个群解散了总之,
散文秋天的丝绒拿铁今天去买咖啡,看到广告语秋天的第一杯丝绒拿铁,感觉好贴切啊。秋天与丝绒听起来是那么地般配,就像一对恋人般美好。咖啡,这个词本身就是浪漫的象征,代表着美好,咖啡馆也是恋人们谈恋爱时首
周五你需要知道的隔夜全球要闻周五你需要知道的隔夜全球要闻美股三大指数集体收跌,欧洲主要股指收盘多数下跌。小摩首席经济学家认为,美联储下周加息100基点的概率不到三分之一。国际原油期货结算价跌超3,WTI原油1