ES拼音前缀索引

栏目: 编程工具 · 发布时间: 6年前

内容简介:大家观察淘宝的首页搜索框,它除了支持中文前缀搜索提示外,还支持拼音前缀搜索提示。拼音分为全拼和首字母两种,ES拼音分词插件需要用开源项目:当我们要索引”2018世界杯”的时候,我们期望产生2种分词结果:

大家观察淘宝的首页搜索框,它除了支持中文前缀搜索提示外,还支持拼音前缀搜索提示。

拼音分为全拼和首字母两种,ES拼音分词插件需要用开源项目: elasticsearch-analysis-pinyin

当我们要索引”2018世界杯”的时候,我们期望产生2种分词结果:

2018shijiebei和2018sjb,即全拼和首拼,我们不需要类似于2018 shi jie bei这种的单字分词。

然后,我们利用ES的edge-ngram filter,将上述2种分词结果,做前缀切分。

2018shijiebei被filter拆成多个term建立倒排:

  • 20
  • 201
  • 2018
  • 2018s
  • 2018sh
  • 2018shi
  • 2018shij
  • 2018shiji
  • 2018shijie

类似的,2018sjb被拆成:

  • 20
  • 201
  • 2018
  • 2018s
  • 2018sj
  • 2018sjb

一旦”2018世界杯”被映射成了这么多term的倒排,那么我们输入任意的前缀搜索词,均可以完成召回。

我现在将全拼和首拼都用一个analyzer拆分,但是建议大家还是把全拼和首拼分成2个anaylzer,这样搜索时相关性打分会更科学,下面看一下配置。

tokenizer

首先配置tokenizer,它的工作是把”2018世界杯”切分成全拼和首拼,一共就2个term。

'tokenizer' => [
	// 拼音分词
	'name_py_tokenizer' => [
		'type' => 'pinyin',
 
		'keep_none_chinese' => false, // 对非中文不拆分词
		'keep_full_pinyin' => false, // 关闭: 刘德华 -> liu, de, hua
 
		'keep_joined_full_pinyin' => true, // 刘德华 -> liudehua
		'keep_none_chinese_in_joined_full_pinyin' => true, // 刘德华2016 -> liudehua2016
 
		'keep_first_letter' => true, // 刘德华 -> ldh
		'keep_none_chinese_in_first_letter' => true, // 刘德华2016 -> ldh2016
 
		'none_chinese_pinyin_tokenize' => false, // 没有卵用
	]
],

如果我们要索引”世界杯worldcup”,那么keep_none_chinese=true则会导致把非中文部分拆出1个独立的term:worldcup,这不是我们希望的,我们只需要shijiebeiworldcup或者sjbworldcup,所以这个选项需要设置false。

其他的配置非常容易理解,看注释即可。

filter

接着,需要利用ES内置的edge-ngram filter,把全拼和首字拼按前缀拆term,也就是上面我们列举的大量的前缀term:

'filter' => [
	// 拼音前缀切词
	'name_py_filter' => [
		'type' => 'edge_ngram',
		'min_gram' => 1,
		'max_gram' => 20,
	]
],

analyzer

最后,我们利用tokenizer+filter来生成一个自定义的分析器:

'analyzer' => [
	// 索引时 - 拼音前缀分析器
	'name_py_analyzer' => [
		'type' => 'custom',
		'tokenizer' => 'name_py_tokenizer',
		'filter' => [
			'name_py_filter',
		]
	],
],

大家注意,analyzer的工作顺序是char_filter -> tokenizer -> filter,我们没有用到char_filter字符过滤。

搜索

搜索时一般应该利用termQuery,不需要对搜索词做分词,但是应该考虑做一些基本处理,比如转换小写,去除标点符号。

因此,我们可以配置一个用于search搜索词处理的analyzer,令其tokenizer使用keyword(不分词),通过char_filter阶段实现标点符号的过滤,通过filter阶段实现大小写转换。

有了search_analyzer,我们可以走matchQuery来应用它,确保搜索词和倒排能容易吻合。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

搜索模式

搜索模式

Peter Morville、Jeffery Callender / 蒋彬 / 电子工业出版社 / 2010-10 / 35.00元

本书是信息架构领域创始人彼得•莫维里的又一力作,全书详尽剖析了10种搜索模式,告诉读者如何为不同情境设计搜索功能,涉及互联网、电子商务、企业、手机、社交和实时搜索等不同平台和领域。每种搜索模式均配以大量案例,并结合了作者自身的经验,因此更富实用性和实战性。书中遍布作者对于搜索模式的探索和思考,既适合对未来的搜索进行前瞻性的探讨,也能够指导当前进行中的项目。一起来看看 《搜索模式》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具