当前位置:   article > 正文

ElasticSearch+IK分词器的安装以及使用介绍_elasticsearch安装ik分词器

elasticsearch安装ik分词器


一、安装elasticsearch+kibana

首先确保docker运行正常

  1. 创建挂在目录
    mkdir -p docker-data/elasticsearch/config
    mkdir -p docker-data/elasticsearch/data
    mkdir -p docker-data/elasticsearch/logs
    mkdir -p docker-data/elasticsearch/plugins
    mkdir -p docker-data/kibana/config
    
    chmod 777 docker-data/elasticsearch/data
    chmod 777 docker-data/elasticsearch/logs
    chmod 777 docker-data/elasticsearch/plugins
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  2. 创建配置文件
    vi /docker-data/elasticsearch/config/elasticsearch.yml
    vi /docker-data/kibana/config/kibana.yml
    
    • 1
    • 2
    elasticsearch.yml
    cluster.name: "docker-cluster"
    network.host: 0.0.0.0
    http.cors.allow-origin: "*"
    http.cors.enabled: true
    http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
    xpack.security.enabled: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    kibana.yml
    server.host: "0.0.0.0"
    server.shutdownTimeout: "5s"
    # 设置ip地址
    elasticsearch.hosts: [ "http://ip:9200" ]
    monitoring.ui.container.elasticsearch.enabled: true
    i18n.locale: "zh-CN"
    elasticsearch.username: "kibana"
    #设置密码
    elasticsearch.password: "123456"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  3. 创建docker-compose.yml 目录随便都可以
    docker-compose.yml
    version: '3.8'
    services:
      # 定义 Elasticsearch 和 Kibana 服务
      elasticsearch:
        container_name: elasticsearch
        image: elasticsearch:8.7.1
        ports:
          - 9200:9200
          # 将宿主机的 9200 端口映射到容器的 9200 端口,用于访问 Elasticsearch HTTP API
          - 9300:9300
          # 将宿主机的 9300 端口映射到容器的 9300 端口,用于 Elasticsearch 节点之间的通信
        restart: 'no'
        environment:
          - discovery.type=single-node
          # 设置 Elasticsearch 的发现类型为单节点
          - ES_JAVA_OPTS=-Xms1024m -Xmx1024m
          # 设置 Elasticsearch 的 Java 虚拟机选项,分配 256MB 堆内存
        volumes:
          - /docker-data/elasticsearch/logs:/usr/share/elasticsearch/logs
          # 挂载日志目录
          - /docker-data/elasticsearch/data:/usr/share/elasticsearch/data
          # 挂载数据目录
          - /docker-data/elasticsearch/plugins:/usr/share/elasticsearch/plugins
          # 挂载插件目录
          - /docker-data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
          # 挂载配置文件
      #Kibana服务    
      kibana:
        container_name: kibana
        restart: 'no'
        image: kibana:8.7.1
        ports:
          - 5601:5601
          # 将宿主机的 5601 端口映射到容器的 5601 端口,用于访问 Kibana Web 界面
        depends_on:
          - elasticsearch
          # 定义依赖关系,表示 Kibana 服务依赖于 Elasticsearch 服务
        volumes:
          - /docker-data/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
          # 挂载配置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  4. 进入docker-compose.yml 目录中 执行docker-compose up -d
    cd /docker-data/elasticsearch_kibana
    docker-compose up -d
    
    • 1
    • 2
  5. 运行完成 查看容器是否正常运行
    docker ps
    
    • 1

二、操作语句

1. 插入语句

# 插入数据到user表中,name = "张三" company="lingli" id=3
# post可以重复写入,如果id存在就更新
POST user/_doc/3
{
  "name":"张三",
  "company":"lingli",
  "age":18
}
#只能插入一次 如果id存在报错
POST user/_create/3
{
  "name":"张三",
  "company":"lingli",
  "age":18
}
# PUT 和 POST 类似,不存在就插入,存在就更新
PUT user/_doc/3
{
  "name":"张三",
  "company":"lingli",
  "age":18
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2. 更新语句

# 单独更新,更新操作如果值没有改变的话不会修改version 和 seq_no 
# 这条操作并不会对数据进行修改
POST user/_update/3
{
  "doc": {
    "name":"张三",
  	"company":"lingli",
  	"age":18
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3. 删除语句

# 删除语句可以删除单条数据 也可以删除整个表
# 删除id = 3  的数据
DELETE user/3
# 删除整个user表
DELETE user
  • 1
  • 2
  • 3
  • 4
  • 5

4. 批量操作 添加,更新,删除

# 批量操作 
# 这里的user表明可以在url中指明,也可以在语句中指明
POST user/_bulk
# 新增
{"create": {"_index": "user", "_type": "docs", "_id": 1}}
{"name": "lin", "company":"jd"}
{"create": {"_index": "user", "_type": "docs", "_id": 2}}
{"name": "dearlin", "company":"ali"}
# 存在更新 不存在 新增
{"index":{ "_index": "user", "_id": "1" }}
{"name": "test", "company":"ali"}
# 更新
{"update":{ "_index": "user", "_id": "1" }}
{"name": "test", "company":"ali"}
# 删除
{"delete": {"_index": "user", "_type": "docs", "_id": "1" }} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

5. 查询语句

5.1 Match Query(匹配查询)

#Match Query(匹配查询)
GET user/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5.2 Term Query(精确查询)

精确查询比较坑,这里你查询张三是查询不到的,因为做了分词处理 只能查询张 or 三

GET /user/_search
{
  "query": {
    "term": {
      "name": "三"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5.3 Range 范围查询

年龄区间为 10- 20

GET user/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5.4 Bool Query(布尔查询)

布尔查询相当于mysql的and 如 name = ‘张三’ and age = 18 and company = ‘jd’ 查询较为复杂的内容时可以用到
must 类似于 name = ‘张三’ and age = 18 and company = ‘jd’
not must 类似于 name != ‘张三’ and age != 18 and company != ‘jd’
should 类似于 name = ‘张三’ or age = 18 or company = ‘jd’

GET user/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"name": "张三"}},
        {"match": {"age": 18}},
        {"match": {"company": "jd"}}
      ],
      "must_not": [{}],
      "should": [{}]
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

5.5 Fuzzy Query(模糊查询)

GET user/_search
{
  "query": {
    "fuzzy": {
      "name": {
        "value": "张四",
        "fuzziness": 2  #编辑距离,通过算法计算 编辑距离也就是通过几次编辑可以到正确的词
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6. 查询分页

查询分页是通过 from size 字段控制

GET user/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0, #对应mysql offset
  "size": 20 # 对应mysql  limit
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

三、IK 分词器

下载安装ik分词器

  1. 下载地址
  2. 下载好后解压到 docker-data/elasticsearch/plugins 修改文件夹名称为ik
    在这里插入图片描述
  3. 重启es
docker restart elasticsearch
  • 1
  1. 进入docker容器,查看是否安装成功
docker exec -it elasticsearch /bin/bash
cd bin 
elasticsearch-plugin list
  • 1
  • 2
  • 3

在这里插入图片描述
ik分词器安装成功

修改ik分词器的自定义词库

  1. 进入config目录 创建自定义词库文件 写入自定义词语 写入停用词库
cd /docker-data/elasticsearch/plugins/ik/config/
mkdir customer
cd customer
vi mydic.dic # 写入自定义词语并保存
vi my_stopword.dic # 写入停用词库
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 更新配置到配置文件
cd /docker-data/elasticsearch/plugins/ik
vi IKAnalyzer.cfg.xml # 修改配置文件地址
  • 1
  • 2

在这里插入图片描述

使用ik分词器

  1. 演示
# ik_smart 细粒度分词模式
GET _analyze
{
  "analyzer": "ik_smart",
  "text":"北京大学是中国最好的高等学府之一"
}
# kibana 演示结果
{
  "tokens": [
    {
      "token": "北京大学",
      "start_offset": 0,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "中国",
      "start_offset": 5,
      "end_offset": 7,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "最好",
      "start_offset": 7,
      "end_offset": 9,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "高等学府",
      "start_offset": 10,
      "end_offset": 14,
      "type": "CN_WORD",
      "position": 3
    },
    {
      "token": "之一",
      "start_offset": 14,
      "end_offset": 16,
      "type": "CN_WORD",
      "position": 4
    }
  ]
}

# ik_max_word 智能分词模式
GET _analyze
{
  "analyzer": "ik_max_word",
  "text":"北京大学是中国最好的高等学府之一"
}
# kibana 演示结果
{
  "tokens": [
    {
      "token": "北京大学",
      "start_offset": 0,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "北京大",
      "start_offset": 0,
      "end_offset": 3,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "北京",
      "start_offset": 0,
      "end_offset": 2,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "大学",
      "start_offset": 2,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 3
    },
    {
      "token": "中国",
      "start_offset": 5,
      "end_offset": 7,
      "type": "CN_WORD",
      "position": 4
    },
    {
      "token": "最好",
      "start_offset": 7,
      "end_offset": 9,
      "type": "CN_WORD",
      "position": 5
    },
    {
      "token": "高等学府",
      "start_offset": 10,
      "end_offset": 14,
      "type": "CN_WORD",
      "position": 6
    },
    {
      "token": "高等",
      "start_offset": 10,
      "end_offset": 12,
      "type": "CN_WORD",
      "position": 7
    },
    {
      "token": "学府",
      "start_offset": 12,
      "end_offset": 14,
      "type": "CN_WORD",
      "position": 8
    },
    {
      "token": "之一",
      "start_offset": 14,
      "end_offset": 16,
      "type": "CN_WORD",
      "position": 9
    },
    {
      "token": "一",
      "start_offset": 15,
      "end_offset": 16,
      "type": "TYPE_CNUM",
      "position": 10
    }
  ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135

可以看出两种分词分词的效果不同

  1. 创建索引 指定分词器
# user 索引已经占用 这里我们使用user_test
PUT user_test
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "analyzer": "ik_max_word", #设置字段保存分词
        "search_analyzer": "ik_max_word" #设置自断搜索分词
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

总结

以上为elasticsearch+ik分词器的使用,感谢观看,加油

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/860232
推荐阅读
相关标签
  

闽ICP备14008679号