ES拼音前缀索引

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

内容简介:大家观察淘宝的首页搜索框,它除了支持中文前缀搜索提示外,还支持拼音前缀搜索提示。拼音分为全拼和首字母两种,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来应用它,确保搜索词和倒排能容易吻合。


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

查看所有标签

猜你喜欢:

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

Building Web Reputation Systems

Building Web Reputation Systems

Randy Farmer、Bryce Glass / Yahoo Press / 2010 / GBP 31.99

What do Amazon's product reviews, eBay's feedback score system, Slashdot's Karma System, and Xbox Live's Achievements have in common? They're all examples of successful reputation systems that enable ......一起来看看 《Building Web Reputation Systems》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

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

多种字符组合密码

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

html转js在线工具