ElasticSearch中文索引优化问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch中文索引优化问题相关的知识,希望对你有一定的参考价值。

参考技术A ElasticSearch对中文的搜索存在一定的缺陷,为了优化查询结果,一方面要从中文解析器的选择入手,另一方面要改变查询时所使用的条件参数。

standard解析器对中文的解析是逐字解析的。

显然很多字符我们并不想拆解,所以需要使用其它的解析器。其中ik与ElasticSearch较为匹配,为官方文档中提及。
使用效果如下:

显然,如果要补足ik的分词效果,可以通过解析后加入“ ”来实现。

为了在索引中使用分词器,需要在mapping的时候进行指定,需要注意的是,mapping一但创建是无法修改的,只能进行添加。

为了验证mapping的指定效果,我们创建如下mapping

同时放入如下数据来作为验证:(部分中间有空格)

这一问题在查询的优化中有一定的影响,很多时候,我们希望所查询的关键字在结果中是呈现一定顺序的。

我们来验证match_phrase和match的区别。
我们先使用standard解析器,结果如下:

注意上面查询结果的分数:因为standard分析将其解析为逐字匹配,所以在一些并未成词的语句中,查询得分也很高。

我们再使用ik解析器簇中的ik_max_word,结果如下:

ik_max_word将词分为:文明古国,文明,古国进行匹配,所以句子中存在完整的“文明古国”时得分最高,相当于同时匹配了三个分词结果;而在结果二中匹配成功了“文明”;结果三四中,只是存在了字,所以结果得分很低,可以通过分数设限来进行过滤。

Elasticsearch搜索中文分词优化

参考技术A Elasticsearch 中文搜索时遇到几个问题:

接下来从以下几点讲一下怎么ES中文分词

索引时,为了提供索引的覆盖范围,通常会采用ik_max_word分析器,会以最细粒度分词索引,搜索时为了提高搜索准确度,会采用ik_smart分析器,会以粗粒度分词
字段mapping设置如下:

analysis索引分析模块充当analyzer分析器的可配置注册表,通过analyzer对文档索引阶段的字段和搜索String进行处理,自定义analyzer时,通常需要character filter tokenizer token filters来完成

首先字符串经过过滤器(character filter),他们的工作是在分词前处理字符串。字符过滤器能够去除HTML标记,例如把“<a>”变成“a

英文分词可以根据空格将单词分开,中文分词比较复杂,可以采用机器学习算法来分词

最后,每个词都通过所有表征过滤(token filters),他可以修改词(例如将“Quick”转为小写),去掉词(例如停用词像“a”、“and”、“the”等等),或者增加词(例如同义词像“a”、“and”、“the”等等)或者增加词(例如同义词像“jump”和“leap”)。

character filter-->>tokenizer-->>token filters

官网example:

通常为了保证索引时覆盖度和搜索时准确度,索引分词器采用ik_max_word,搜索分析器采用ik_smart模式

因为倒排索引中的数据是索引时由分词器来处理的,如果分词器有变化,那么搜索时query关键词即使和doc中关键词相同,但是因为分词器的原因,分出来的词会出现不匹配的情况,因此当mapping或者分词器字典同义词词典等发生变化时,需要reindex索引数据

2.1 建议同义词词典

自定义添加同义词通过ik分词器

想查看同义词效果或者测试分词效果

suggest词需要对拼音前缀,全拼,中文进行前缀匹配,例如:“百度”一词,键入"baidu","bd","百"都必须匹配到,因此在索引的时候需要一词分多个分词器来索引保存,中文采用单字分词,拼音首字母和全拼需要自定义analyzer来索引。

部分内容有待完善

以上是关于ElasticSearch中文索引优化问题的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch中文索引优化问题

ES(ElasticSearch) 索引创建

〈二〉ElasticSearch的认识:索引类型文档

优化 Elasticsearch 索引

Elasticsearch 安装

探索Elasticsearch集群API