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来应用它,确保搜索词和倒排能容易吻合。


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

查看所有标签

猜你喜欢:

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

九败一胜

九败一胜

李志刚 / 北京联合出版公司 / 2014-9-1 / 42.00元

所有的创业者都面临着很多问题,困惑不是个人的,是有共性的。 除了自身去摸索着石头走路,他们还可以通过学习,从那些在创业路上走得更远的创业者身上学到经验、教训。 这本书的主角——王兴,恰好就是一个很好的学习对象。出生于1979年的王兴,很早就创业了,2004他就开始和同学一块创业,2005年做出了校内网;2007年,他又做出了饭否网——这是中国最早的类似twitter的网站。 ......一起来看看 《九败一胜》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具