前言
之前实现了句子的查询,并且将句子进行查询之前,已经分词并且去除了停用词,剩下的很多停用词都是可能与句子的意思之间相关的所以并没有被去掉,这样的句子放入ElasticSearch进行查询时,会被切分,然后查询结果中会有很多不必要出现的停用词,作为关键词出现,初步分数是分词器的问题。
在使用 elasticsearch 进行搜索的时候,经常会发现一篇和搜索关键字完全不匹配的文章排在最前面。它可能就被 ik_max_word 分词后,刚好就有类似 “的” 这样的无意义词,导致造成一篇含有很多无意义词的文章得到一个较高的评分。
如下:
尝试IK分词器
之前下载过ik分词器,但是发现放错了地方,并没有生效,现在进行了重新的配置。
但是启动ElasticSearch时,报错,发现是ElasticSearch与分词器的版本对不上,所以又去找到了对应版本的分词器
我使用的是6.8.8的ElasticSearch:
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v6.8.8
然后进行配置
配置文件在 elasticsearch-7.x.x\plugins\ik\config\ 目录下,打开目录可以看到有 stopword.dic 和 extra_stopword.dic 两个文件。stopword.dic 里面的为配置的英文停用词,extra_stopword.dic 里面为配置的中文停用词。
默认是使用 stopword.dic 的,想要使用 extra_stopword.dic 的话是需要在 ik 中进行配置的,配置文件为 IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">extra_stopword.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
IK分词,主要强调两种分词模式:ik_smart和ik_max_word
更换成ik_smart尝试
重启之后重新建立索引的检索结果为:
发现已经和之前的结果不一样了,但是还是出现了很多的垃圾
pinyin分词器
拼音分词器有许多可以设置的选项。可以自行定义。原本的拼音分词器,只能分析出来全拼、首字母全拼、和每个字的完整拼音,这里我先用默认的试了试
之后发现有人将ik中文分词器和 pinyin分词器共同使用。
pinyin分词器会讲查询分解成更准确的拼音
https://github.com/medcl/elasticsearch-analysis-pinyin/releases/tag/v6.8.8
发现结果并没有什么变化,还是一如既往的差。更换分词器的类型
emm还是没有什么差距
更换一下查询的QueryBuilder
QueryBuilder titleQuery = QueryBuilders.disMaxQuery();
QueryBuilder contentQuery = QueryBuilders.disMaxQuery();
((DisMaxQueryBuilder) titleQuery).add(QueryBuilders.matchQuery("title", content));
((DisMaxQueryBuilder) contentQuery).add(QueryBuilders.matchQuery("content", content));
总结
发现拼音分词器的效果还是比ik分词器要好一些,花的时间也算没有白费。