Elasticsearch中,内置了很多分词器(analyzers),例如standard (标准分词器)、english (英文分词)和chinese (中文分词)。
分词的操作也称为“分析(analysis)”. analysis过程由两个步骤的操作组成:首先将文本切分为terms(词项)以适合构建倒排索引,其次将各terms正规化为标准形式以提升其“可搜索度”。这两个步骤由分词器完成。
一个分词器通常需要由三个组件构成:字符过滤器(character filters),分词器(tokenizer)和分词过滤器(token filters)组成。
字符过滤器:在文本被切割之前进行清理操作,例如移除HTML标签,将&替换为字符等。
分词器:将文本切分为独立的词项;简单的分词器通常是根据空白及标点符号进行切分。
分词过滤器:转换字符(如将大写转为小写)、移除词项(如移除a、an、of及the等)或者添加词项(例如,添加同义词)。
测试默认分词插件
http get http://localhost:9200/_analyze?analyzer=standard&pretty=true&text=test分词测试
{
"tokens" : [
{
"token" : "test",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "测",
"start_offset" : 4,
"end_offset" : 5,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "试",
"start_offset" : 5,
"end_offset" : 6,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "中",
"start_offset" : 6,
"end_offset" : 7,
"type" : "<IDEOGRAPHIC>",
"position" : 3
},
{
"token" : "文",
"start_offset" : 7,
"end_offset" : 8,
"type" : "<IDEOGRAPHIC>",
"position" : 4
},
{
"token" : "分",
"start_offset" : 8,
"end_offset" : 9,
"type" : "<IDEOGRAPHIC>",
"position" : 5
},
{
"token" : "词",
"start_offset" : 9,
"end_offset" : 10,
"type" : "<IDEOGRAPHIC>",
"position" : 6
}
]
}
安装中文分词ik
下载
这里用的es版本是5.3.2,所以我下载的ik分词器也是对应的5.3.2版本,下载地址:https://github.com/medcl/elasticsearch-analysis-ik
编译安装
下载完成后切换到相应的5.3.2的tags:git checkout tags/v5.3.2
进入elasticsearch-analysis-ik文件夹内执行:mvn clean package
命令打包编译。
执行完以上命令会生成一个target文件夹,将target/releases文件夹内的elasticsearch-analysis-ik-5.3.2.zip
copy到es的plugins文件夹内,解压后修改文件夹名称为analysis-ik:elasticsearch-5.3.2\plugins\analysis-ik。
analysis-ik|
-commons-codec-1.9.jar
-commons-logging-1.2.jar
-elasticsearch-analysis-ik-5.3.2.jar
-httpclient-4.5.2.jar
-httpcore-4.4.4.jar
-plugin-descriptor.properties
-config|
--IKAnalyzer.cfg.xml
--...
--custom|
---...
启动测试
启动es:./elasticsearch-5.3.2/bin/elasticsearch.bat
当我们看到启动控制台打印出
[2017-05-17T14:16:10,252][INFO ][o.e.p.PluginsService ] [XCwou8Z] loaded plugin [analysis-ik]
时就表示ik插件安装成功了。
测试一下:http + get http://localhost:9200/_analyze?analyzer=ik_smart&pretty=true&text=test分词测试
{
"tokens" : [
{
"token" : "test",
"start_offset" : 0,
"end_offset" : 4,
"type" : "ENGLISH",
"position" : 0
},
{
"token" : "分词",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "测试",
"start_offset" : 6,
"end_offset" : 8,
"type" : "CN_WORD",
"position" : 2
}
]
}
http + get http://localhost:9200/_analyze?analyzer=ik_max_word&pretty=true&text=test分词测试
{
"tokens" : [
{
"token" : "test",
"start_offset" : 0,
"end_offset" : 4,
"type" : "ENGLISH",
"position" : 0
},
{
"token" : "分词",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "词",
"start_offset" : 5,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "测试",
"start_offset" : 6,
"end_offset" : 8,
"type" : "CN_WORD",
"position" : 3
}
]
}
以上两个测试结果的不同说明了:
1、ik_max_word:会将文本做最细粒度的拆分,比如将“test分词测试”拆分成“test”、“分词”、“词”、“测试”。
2、ik_smart:会做最粗粒度的拆分,比如将“test分词测试”拆分成“test”、“分词”、“测试”。