所有的语言分词,默认使用的都是“Standard Analyzer”,但是这些分词器针对于中文的分词,并不友好。为此需要安装中文的分词器。

下面以IK分词器为例:

下载分词器

# 进入ElasticSearch容器下载(或者在外部关联文件进行下载)
docker exec -it elasticsearch /bin/bash
# 下载分词器
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
# 解压分词器到ik目录中
unzip elasticsearch-analysis-ik-7.4.2.zip -d ik
# 移动ik到plugins目录下
mv ik plugins/
# 赋予ik目录权限
chmod -R 777 plugins/ik
# 重新启动es
docker restart elasticsearch

standard

默认分词器,不指定就是它。

GET _analyze
{
   "analyzer": "standard",
   "text":"我是中国人"
}
{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "中",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "国",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "人",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    }
  ]
}

ik_smart

会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。

GET _analyze
{
   "analyzer": "ik_smart", 
   "text":"我是中国人"
}
{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "中国人",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    }
  ]
}

ik_max_word

会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。

GET _analyze
{
   "analyzer": "ik_max_word", 
   "text":"我是中国人"
}
{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "中国人",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "中国",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "国人",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 4
    }
  ]
}

自定义词库

我想分词“乔碧萝殿下”,但是“乔碧萝”ik分词器词库可能没有。

所以这里我们要通过Nginx,它把当做一个静态服务器,把词库放到静态服务器上,es就可以读取到了。

安装Nginx

# 随便启动一个Nginx实例 为了获取它的配置
docker run -p80:80 --name nginx -d nginx:1.10
# 将nginx容器内的配置文件拷贝到/mydata下
docker container cp nginx:/etc/nginx  /mydata
cd mydata/
# 把拷贝下来的文件夹改名
mv nginx conf
# 创建一个新的名为ngin的目录
mkdir nginx
# 把拷贝的配置已经去 这样就和启动Nginx时的配置文件的路径一致了
mv conf nginx
# 停止原来的容器 并删除掉
docker stop nginx
docker rm nginx
# 创建新的容器 挂载各种配置信息
docker run -p 80:80 --name nginx \
 -v /mydata/nginx/html:/usr/share/nginx/html \
 -v /mydata/nginx/logs:/var/log/nginx \
 -v /mydata/nginx/conf/:/etc/nginx \
 -d nginx:1.10
# 设置开机自动启动nginx
docker update nginx --restart=always

把词库放到Nginx目录中

mkdir /mydata/nginx/html/es
cd /mydata/nginx/html/es
# 在词库里面 输入 “乔碧萝”
echo "乔碧萝" > /mydata/nginx/html/fenci.txt 

测试结果

GET _analyze
{
   "analyzer": "ik_max_word", 
   "text":乔碧萝殿下"
}
{
  "tokens" : [
    {
      "token" : "乔碧萝",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "殿下",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 1
    }
  ]
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐