大数据求索(10): 解决ElasticSearch中文搜索无结果-----IK中文分词器的安装与使用
问题所在
在中文情况下,ES默认分词器会将汉字切分为一个一个的汉字,所以当搜索词语的时候,会发现无法找到结果。
解决办法
有很多其他的分词器插件可以替代,这里使用最常用的IK分词器。
IK分词器安装
注意:
ik分词器必须和ES版本严格对应,否则可能会产生意料之外的错误。
Github地址:https://github.com/medcl/elasticsearch-analysis-ik
可以直接下载releases下面的源码,使用maven进行编译。
把下载的elasticsearch-analysis-ik.zip解压
进入elasticsearch-analysis-ik-master/ 下,打包。
mvn clean package
打包后的文件在elasticsearch-analysis-ik-master/target/relearses
目录下,名称类似如下,是一个zip文件。
elasticsearch-analysis-ik-5.6.2.zip
在/home/hadoop/cluster/elasticsearch/plugins创建ik文件夹,并将打包后的zip文件解压到此文件夹下,此时ik目录下一般有如下几个文件
commons-codec-1.9.jar config httpclient-4.5.2.jar plugin-descriptor.properties
commons-logging-1.2.jar elasticsearch-analysis-ik-5.6.2.jar httpcore-4.4.4.jar
此时,重启ES即可。
IK分词器的使用
使用IK分词器,由于认识较浅,只找到一种方法,就是改变ES中index的mapping。此外,由于mapping一旦创建就无法修改,所以,只能重新创建一个新的index,里面没数据 ,并设置mapping。java代码举例如下:
/**
* 重新生成mapping,使用ik分词器
* @throws Exception
*/
@Test
public void setMapping() throws Exception {
TransportClient client = getClient();
// 设置mapping,使用ik分词器
// 没有数据之前才能成功,如果已经有mapping,则无法重新创建
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.startObject("article")
.startObject("properties")
.startObject("title").field("type", "text").field("store"