简介

https://www.elastic.co/guide/en/elasticsearch/reference/7.x/analysis.html

一个tokenizer(分词器)接收一个字符流,将之分割为独立的tokens(词元,通常是独立的单词),然后输出tokens流。
例如:whitespace tokenizer遇到空白字符时分割文本。它会将文本“Quick brown fox!”分割为[Quick,brown,fox!]。
该tokenizer(分词器)还负责记录各个terms(词条)的顺序或position位置(用于phrase短语和word proximity词近邻查询),以及term(词条)所代表的原始word(单词)的start(起始)和end(结束)的character offsets(字符串偏移量)(用于高亮显示搜索的内容)。
elasticsearch提供了很多内置的分词器,可以用来构建custom analyzers(自定义分词器)。

使用分词器对文本进行分析

  1. POST _analyze
  2. {
  3. "analyzer": "standard", // 指定分词器
  4. "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." // 被分析的文本
  5. }

默认的分词器一般都是针对于英文,对于中文我们需要安装额外的分词器来进行分词。

安装IK分词器

下载

事前准备:

  • IK 分词器属于 Elasticsearch 的插件,所以 IK 分词器的安装目录是 Elasticsearch 的 plugins 目录,在我们使用Docker启动 Elasticsearch 时,已经将该目录挂载到主机的 /mydata/elasticsearch/plugins 目录。
  • IK 分词器的版本需要跟 Elasticsearch 的版本对应,当前选择的版本为 7.4.2,下载地址为:Github Release 或访问:镜像地址
  1. # 进入挂载的插件目录 /mydata/elasticsearch/plugins
  2. cd /mydata/elasticsearch/plugins
  3. # 安装 wget 下载工具
  4. yum install -y wget
  5. # 下载对应版本的 IK 分词器(这里是7.4.2)
  6. wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip

这里已经在挂载的 plugins 目录安装好了 IK分词器。现在我们进入到 es 容器内部检查是否成功安装

  1. # 进入容器内部
  2. docker exec -it elasticsearch /bin/bash
  3. # 查看 es 插件目录
  4. ls /usr/share/elasticsearch/plugins
  5. # 可以看到 elasticsearch-analysis-ik-7.4.2.zip

所以我们之后只需要在挂载的目录/mydata/elasticsearch/plugins下进行操作即可。

解压

  1. # 进入到 es 的插件目录
  2. cd /mydata/elasticsearch/plugins
  3. # 解压到 plugins 目录下的 ik 目录
  4. unzip elasticsearch-analysis-ik-7.4.2.zip -d ik
  5. # 删除下载的压缩包
  6. rm -f elasticsearch-analysis-ik-7.4.2.zip
  7. # 修改文件夹访问权限
  8. chmod -R 777 ik/

查看安装的ik插件

  1. # 进入 es 容器内部
  2. docker exec -it elasticsearch /bin/bash
  3. # 进入 es bin 目录
  4. cd /usr/share/elasticsearch/bin
  5. # 执行查看命令 显示 ik
  6. elasticsearch-plugin list
  7. # 退出容器
  8. exit
  9. # 重启 Elasticsearch
  10. docker restart elasticsearch

重启遇到错误:

Error response from daemon: driver failed programming external connectivity on endpoint elasticsearch (0cf6a38895d321cc793f1f26ebef2335b902328116db2cd01a50601090ff2d07): (iptables failed: iptables —wait -t nat -A DOCKER -p tcp -d 0/0 —dport 9300 -j DNAT —to-destination 172.17.0.6:9300 ! -i docker0: iptables: No chain/target/match by that name.

解决:重启docker systemctl restart docker

测试 ik 分词器

  1. POST _analyze
  2. {
  3. "analyzer": "ik_max_word",
  4. "text": "阿里巴巴云服务器"
  5. }

自定义扩展分词库

我们在 nginx 中自定义分词文件,通过配置 es 的 ik 配置文件来远程调用 nginx 中的分词文件来实现自定义扩展词库。 注:默认 nginx 请求的是数据目录的 html 静态目录 nginx 安装参考:docker 安装 nginx

Nginx 中自定义分词文件

  1. # 创建一个目录用来放es分词信息
  2. mkdir /mydata/nginx/html/es
  3. # 追加内容到fenci.txt文件中
  4. echo "乔碧罗" > /mydata/nginx/html/es/fenci.txt

当我们访问 Nginx 时,默认会读取 html 文件夹下的内容;http://host:port/es/fenci.txt 就可以访问到我们的 fenci.txt 文件了

给 es 配置自定义词库

  1. # 1. 打开并编辑 ik 插件配置文件
  2. vim /mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

修改为以下内容:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  3. <properties>
  4. <comment>IK Analyzer 扩展配置</comment>
  5. <!--用户可以在这里配置自己的扩展字典 -->
  6. <entry key="ext_dict"></entry>
  7. <!--用户可以在这里配置自己的扩展停止词字典-->
  8. <entry key="ext_stopwords"></entry>
  9. <!--用户可以在这里配置远程扩展字典 -->
  10. <entry key="remote_ext_dict">http://192.168.200.130/es/fenci.txt</entry> <!-- 这里是改动内容 -->
  11. <!--用户可以在这里配置远程扩展停止词字典-->
  12. <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
  13. </properties>

重启 elasticsearch 容器

  1. docker restart elasticsearch

测试自定义词库

  1. GET /my_index/_analyze
  2. {
  3. "analyzer": "ik_max_word",
  4. "text":"乔碧罗殿下"
  5. }

结果

  1. {
  2. "tokens" : [
  3. {
  4. "token" : "乔碧罗",
  5. "start_offset" : 0,
  6. "end_offset" : 3,
  7. "type" : "CN_WORD",
  8. "position" : 0
  9. },
  10. {
  11. "token" : "殿下",
  12. "start_offset" : 3,
  13. "end_offset" : 5,
  14. "type" : "CN_WORD",
  15. "position" : 1
  16. }
  17. ]
  18. }

Docker 安装 Nginx

这里介绍如何使用 docker 安装 nginx,首先我们先启动一个临时的 nginx,将它的配置拷贝到我们将要挂载的本机 nginx 配置目录中,之后再创建一个新的我们要用的 nginx 容器。

创建要挂载的配置目录

  1. mkdir -p /mydata/nginx/conf

启动临时nginx容器

  1. docker run -p 80:80 --name nginx -d nginx:1.10

拷贝出 Nginx 容器的配置

  1. # 将nginx容器中的nginx目录复制到本机的/mydata/nginx/conf目录
  2. docker container cp nginx:/etc/nginx /mydata/nginx/conf
  3. # 复制的是nginx目录,将该目录的所有文件移动到 conf 目录
  4. mv /mydata/nginx/conf/nginx/* /mydata/nginx/conf/
  5. # 删除多余的 /mydata/nginx/conf/nginx目录
  6. rm -rf /mydata/nginx/conf/nginx

删除临时nginx容器

  1. # 停止运行 nginx 容器
  2. docker stop nginx
  3. # 删除 nginx 容器
  4. docker rm nginx

启动 nginx 容器

  1. docker run -p 80:80 --name nginx \
  2. -v /mydata/nginx/html:/usr/share/nginx/html \
  3. -v /mydata/nginx/logs:/var/log/nginx \
  4. -v /mydata/nginx/conf/:/etc/nginx \
  5. -d nginx:1.10

设置 nginx 随 Docker 启动

  1. docker update nginx --restart=always

测试 nginx

  1. echo '<h1>GuliMall</h1>' >/mydata/nginx/html/index.html

浏览器访问 http://192.168.200.130/ 可以看到下面内容说明安装成功
image.png