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


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

查看所有标签

猜你喜欢:

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

科技之巅

科技之巅

麻省理工科技评论 / 人民邮电出版社 / 2016-10-1 / CNY 98.00

《麻省理工科技评论》从2001年开始,每年都会公布“10大突破技术”,即TR10(Technology Review 10),并预测其大规模商业化的潜力,以及对人类生活和社会的重大影响。 这些技术代表了当前世界科技的发展前沿和未来发展方向,集中反映了近年来世界科技发展的新特点和新趋势,将引领面向未来的研究方向。其中许多技术已经走向市场,主导着产业技术的发展,极大地推动了经济社会发展和科技创新......一起来看看 《科技之巅》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

html转js在线工具
html转js在线工具

html转js在线工具