Elasticsearch中的分词介绍

1、概述
在我们初次使用Elasticsearch查询的时候,有时会很困惑,为什么我存储的一段String数据,却查询不到?为什么输入了汉语单词,只能一个字一个字的匹配?等这些都与是否分词、使用什么分词器有关。

1.1 分词概念
首先说说什么是分词器吧! 比如“分词介绍”:
如果是标准分词器,会把它拆分成“分”,“词”,“介”,“绍”。
如果使用一些汉语的分词器,则会分析成“分词”,“介绍”。

由于倒排索引都是以词term为索引的,因此如果分解成了一个一个的词,查询“分词”的时候,分词也会被分解成“分”,“词”,这样就可能误查到”中文分词“等之类的词。

1.2 关于String类型——分词与不分词
在Elasticsearch中String是最基本的数据类型,如果不是数字或者标准格式的日期等这种很明显的类型,其他的一般都会优先默认存储成String。我们这里使用ik中文分词。

2、安装中文分词ik
Elasticsearch的中文分词很烂,所以我们需要安装ik中文分词。首先可以从github上下载项目(https://github.com/medcl/elasticsearch-analysis-ik/),解压之后打成jar包,将jar包复制到Elasticsearch的plugins/目录下,再把解压出的ik目录(配置和词典等),复制到Elasticsearch的config 目录下。然后编辑配置文件elasticsearch.yml,在后面加:

index.analysis.analyzer.default.type: ik

重启elasticsearch搞定。

3、查看ElasticSearch的分词
3.1 集群级分词的定义
集群级的分词定义是在conf目录下的elasticsearch.yml文件里定义,内容大致如下:

index.analysis.analyzer.ik.type : "ik"

3.2 特定index的分词
3.2.1 在定义analyze之前,先关闭index。其实并不需要关闭也可以生效,但是为了数据一致性考虑,还是先执行关闭。

curl -XPOST http://localhost:9400/index_test/_close

然后执行:

curl -XPUT localhost:9400/index_test/_settings -d '
{
   "analysis": {
      "analyzer":{
             "ikAnalyzer":{
                 "type":"org.elasticsearch.index.analysis.IkAnalyzerProvider",
                    "alias":"ik"
                }
            }
     }
}'

最后打开index:

curl -XPOST http://localhost:9400/index_test/_open

到此为止一个新的类型的分词器就定义好了。

4、分词对于查询的影响
4.1 对于分词的字段
(1)如果查询的是单个词,则查询到包含它的文档,返回结果与匹配程度有关
(2)如果查询的是多个词即一段能被分析的词,比如hello world。那么查询的结果是包含分析得出的词的文档,包含hello或world的全部文档。

4.2 对于不分词的字段
只有查询的是目标字段的精确值,才能匹配。比如hello world,必须查询hello world,才可以找到文档。

阅读更多

没有更多推荐了,返回首页