使用docker安装elasticsearch和kibana,ik分词器,拼音分词器安装、使用和介绍

目录

一、Elasticsearch概念

倒排索引和正向索引

正向和倒排

二、ES安装

三、安装 kibana

四、IK分词器

下载ES中文分词器

扩展或停用词条

五、拼音分词器


一、Elasticsearch概念

倒排索引和正向索引

正向索引

        就像在mysql数据中搜索非主键字段的内容,就需要逐条数据的去查,比如加where条件,逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。

倒排索引

  • 文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息

  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条

 比如以下图片中,小米词条在表数据id为1、3、4中有,文档id就就为1、3、4

 倒排索引的搜索流程如下(以搜索"小米手环"为例):

1)用户输入条件"小米手环""进行搜索。

2)对用户输入内容分词,得到词条:小米、手环。

3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、3、4。

4)拿着文档id到正向索引中查找具体文档。

正向和倒排

那么为什么一个叫做正向索引,一个叫做倒排索引呢?

  • 正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程

  • 倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程

是不是恰好反过来了?

那么两者方式的优缺点是什么呢?

正向索引

  • 优点:

    • 可以给多个字段创建索引

    • 根据索引字段搜索、排序速度非常快

  • 缺点:

    • 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引

  • 优点:

    • 根据词条搜索、模糊搜索时,速度非常快

  • 缺点:

    • 只能给词条创建索引,而不是字段

    • 无法根据字段做排序

ES是面向文档存储的,可以是数据库中的一条商品数据,一个顶单信息

文档信息会被序列化为JSON格式后存储在ES中

索引(index):相同类型的文档集合

映射(mapping):索引中文档的字段约束信息,类似表的结构约束

比如:

我们统一的把Mysql与ES的概念做一下对比:

MySQLElasticsearch说明
TableIndex索引(index),就是文档的集合,类似数据库的表(table)
RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQLDSLDSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

Mysql:擅长事务类型操作,可以确保数据的安全和一致性

Elasticsearch:擅长海量数据的搜索、分析、计算

Mysql和ES是互补关系,在合适的场景下选择合适的技术

二、ES安装

创建docker网络,在同一网络中的容器可以互联,相互访问

docker network create es-network

 查看已存在的网络

sudo docker network ls

注意】ES docker 镜像的版本为7.17.16 后续安装IK分词器的版本也要与之对应,否则启动报错,kibana版本也最好与之对应

拉取镜像:

sudo docker pull elasticsearch:7.17.16

使用 -m 标志为容器设置内存限制。这样就无需手动设置 JVM 大小了

  • -e "discovery.type=single-node":非集群模式

  • -e "http.host=0.0.0.0":监听的地址,可以外网访问

  • -v es-data:/usr/share/elasticsearch/data:挂载逻辑卷,绑定es的数据目录

  • -v es-logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录

  • -v es-plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录

  • 9200:供用户访问端口

  • 9300:个es结点互访的端口,现在非必须 

sudo docker run -d \
    --net es-network \
    -m 1GB \
	--name es \
    -e "discovery.type=single-node" \
    -v ./es/data:/usr/share/elasticsearch/data \
    -v ./es/plugins:/usr/share/elasticsearch/plugins \
    -v ./es/logs:/usr/share/elasticsearch/logs \
    --privileged \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.17.16

注意要在es/data所在目录下运行,或者改为绝对路径

ES启动有些许慢,可通过ES容器日志查看进度

 sudo docker logs --tail 100 -f es

ElasticSearch文件目录说明

目录说明
bin可执行文件目录
config配置文件目录
jdkJAVA工具包
lib第三方依赖库
logs输出日志目录
modules依赖模块目录
plugins插件目录
data数据存储目录

在浏览器中输入IP+端口访问:http://172.30.171.205:9200 即可看到elasticsearch的响应结果:

三、安装 kibana

kibana可以给我们提供一个elasticsearch的可视化界面,便于学习

拉取镜像:

sudo docker pull kibana:7.17.18

启动kibana容器

与ES需要在同一个网络es-network

添加环境变量ELASTICSEARCH_HOSTS指定ES访问地址,因为在同一个网络下,可以使用主机名es代替IP地址

sudo docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--net=es-network \
-p 5601:5601  \
kibana:7.17.18

 浏览器访问 kibana, http://172.30.171.205:5601

Add integrations:从如何来源添加数据 ; Explore on my own :自己探索,这里我们自己探索

使用Dev Tools对Elasticsearch发送DSL请求,点击旁边三杆,向下翻找到Dev Tools

输入DSL语句查询所有数据,点击三角发送请求

docker-compose启动es和kibana:

version: "3"

# 创建网络
networks:
  cloud-net:
    driver: bridge
    
services:
  es:
    image: elasticsearch:7.17.16
    container_name: es
    restart: always
    environment:
      - discovery.type=single-node
    volumes:
      - ./es/data:/usr/share/elasticsearch/data
      - ./es/plugins:/usr/share/elasticsearch/plugins
      - ./es/logs:/usr/share/elasticsearch/logs
    privileged: true
    ports:
      - "9200:9200"
      - "9300:9300"
    #内存限制
    deploy:
      resources:
        limits:
          memory: 1G
        reservations:
          memory: 50M
    networks:
      - cloud-net

  kibana:
    image: kibana:7.17.16
    container_name: kibana
    restart: always
    environment:
      ELASTICSEARCH_HOSTS: http://es:9200
    ports:
    - "5601:5601"
    depends_on:
      - es
    networks:
      - cloud-net

四、IK分词器

        使用默认的ES的分词器对中文的分词效果不好,可以发现ES英文分词效果可以,但是对中文只能一个字一个字的分,在搜索时效率低,并且搜不到自己想要的。所以要下载IK分词器,添加插件

 分词器的作用是什么?

  • 创建倒排索引时对文档分词

  • 用户搜索时,对输入的内容分词

elasticsearch中分词器(analyzer)的组成包含三部分:

  • character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符

  • tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart

  • tokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等

查看ES插件数据卷目录挂在地址,也可以使用自己自己启动容器指定的目录,我的是:-v ./es/plugins:/usr/share/elasticsearch/plugins:

sudo docker volume inspect es-plugins

下载ES中文分词器

前往github上下载:https://github.com/medcl/elasticsearch-analysis-ik/releases,选择版本为7.17.16,复制链接地址

进入挂载目录下(es/plugins),服务器中使用wget命令下载

wget https://github.com/infinilabs/analysis-ik/releases/download/v7.17.16/elasticsearch-analysis-ik-7.17.16.zip

 创建ik目录,并将下载的压缩包解压到当前目录下

mkdir ik

unzip elasticsearch-analysis-ik-7.17.16.zip -d ./ik

 或者将压缩包解压后拖入挂载目录下,并重命名为ik

mv elasticsearch-analysis-ik-7.17.16/ ik

 重启ES容器:

sudo docker restart es

IK分词器的分词模式

  • ik_smart:智能切分,粗粒度

  • ik_max_word:最细切分,细粒度

扩展或停用词条

在plugins/ik/config目录下找到 IKAnalyzer.cfg.xml 文件设置添加词条或停用词条的文件地址,这里是当前的config目录下

拓展词条

添加扩展词条,一些网络流词等词库中没有,新建ext.dic文件添加内容,这样就可以对这些没有的不能分词的词进行分词了

停用词条

目录下的stopword.dir文件中添加停用词

比如语气词,敏感词等

  • 利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典

  • 在词典中添加拓展词条或者停用词条

修改后需要重启ES容器,就可以根据自己添加或停用的词进行分词了。

五、拼音分词器

与 ik分词器安装方式一样

汉字和拼音之间进行转换,es/plugins目录下  下载7.17.16版本:

wget https://github.com/infinilabs/analysis-pinyin/releases/download/v7.17.16/elasticsearch-analysis-pinyin-7.17.16.zip

 其他版本:Tags · infinilabs/analysis-pinyin (github.com)

 创建pinyin文件夹并解压到该文件夹下,并

mkdir pinyin

unzip elasticsearch-analysis-pinyin-7.17.16.zip -d ./pinyin

 记得删除下载的压缩包或者移动到挂载目录之外,不然启动会报错

重启ES服务

应用场景:可以根据用户输入的拼音进行搜索,比如sj对应手机,书架等

简单使用:

 创建索引库时指定自定义分词器,约束name字段时使用我们自定义的my_analyzer分词器,tokenizer使用ik_max_word,filter(过滤器)使用拼音分词器

PUT /demo
{
  "settings": {
    "analysis": {
      "analyzer": { // 自定义分词器
        "my_analyzer": {  // 分词器名称
          "tokenizer": "ik_max_word",
          "filter": "py"
        }
      },
      "filter": { // 自定义tokenizer filter
        "py": { // 过滤器名称
          "type": "pinyin", // 过滤器类型,这里是pinyin
		  "keep_full_pinyin": false,
          "keep_joined_full_pinyin": true,
          "keep_original": true,
          "limit_first_letter_length": 16,
          "remove_duplicated_term": true,
          "none_chinese_pinyin_tokenize": false
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer",
        "search_analyzer": "ik_smart"
      }
    }
  }
}

 上述语句中,实现会将能分词的文本字段name按照一定的规则切割成词条(term)   

再将tokenizer输出的词条做进一步的拼音处理

  "search_analyzer":选择搜索时使用的分词器,如果没有用时,通过汉字搜索则会出现同音词会被搜出来

 加了search_analyzer,搜索时会使用配置的分词器,这里是ik分词器:

 搜索拼音也会得到结果:

 "keep_full_pinyin": false  #启用后,保留每个汉字的完整拼音。例如, 刘德华 变为 [ liu , de , hua ]。默认值:true。
          "keep_joined_full_pinyin": true #启用后,加入每个汉字的完整拼音。例如, 刘德华 变为 [ liudehua ]。默认值:false。
          "keep_original": true #启用后,也会保留原始输入。默认值:false。
          "limit_first_letter_length": 16 #设置第一个字母结果的最大长度。默认值:16。
          "remove_duplicated_term": true #启用后,删除重复的术语以节省索引空间。例如, de的 变为 de .默认值:false。注意:与职位相关的查询可能会受到影响。
          "none_chinese_pinyin_tokenize": false #如果非中文字母是拼音,则将其分解为单独的拼音术语。默认值:true。例如, liudehuaalibaba13zhuanghan 变为 liu 、 de 、 hua a li ba ba 13 zhuang han 。注意: keep_none_chinese 应 keep_none_chinese_together 首先启用。

 github上有更多详细配置:infinilabs/analysis-pinyin: 🛵 This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin. (github.com)

我遇到的问题:

        7.17.20版本的ES没有对应的IK分词器版本,启动ES容器会报错

        7.17.18版本的ES容器,非root用户启动,有莫名的权限问题,贴在评论区了

        所以我改成了7.17.16版本的ES,启动正常,但是如果你是非root用户启动,也不是自己创建的数据卷挂载目录,需要修改es挂载目录 ./es 权限:
 

sudo chown -R teacher:teacher ./es/

END

  • 61
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以按照以下步骤安装Elasticsearchik分词器: 1. 首先安装DockerDocker Compose,可以参考官方文档进行安装。 2. 在本地创建一个文件夹,例如命名为 `elasticsearch`。 3. 在 `elasticsearch` 文件夹下新建一个 `docker-compose.yml` 文件,写入以下内容: ``` version: '3.7' services: elasticsearch: image: elasticsearch:7.9.3 container_name: elasticsearch environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms512m -Xmx512m ports: - 9200:9200 - 9300:9300 volumes: - ./data:/usr/share/elasticsearch/data ``` 这里使用的是 Elasticsearch 7.9.3 版本,可以根据需要进行修改。 4. 在 `elasticsearch` 文件夹下新建一个 `data` 文件夹,用于存储 Elasticsearch 的数据。 5. 在 `elasticsearch` 文件夹下新建一个 `Dockerfile` 文件,写入以下内容: ``` FROM elasticsearch:7.9.3 RUN elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.3/elasticsearch-analysis-ik-7.9.3.zip ``` 这里使用的是 Elasticsearch 7.9.3 版本和 ik 分词器 7.9.3 版本,可以根据需要进行修改。 6. 在终端进入 `elasticsearch` 文件夹,执行以下命令启动 Elasticsearch: ``` docker-compose up -d ``` 等待一段时间,可以通过访问 `http://localhost:9200/` 来验证 Elasticsearch 是否启动成功。 7. 如果需要在代码中使用 ik 分词器,需要在代码中添加以下依赖: ``` <dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>analysis-ik</artifactId> <version>7.9.3</version> </dependency> ``` 然后在代码中使用 `IKAnalyzer` 来进行分词。 ``` Analyzer analyzer = new IKAnalyzer(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值