IK分词器安装、配置、分词自定义、Rest使用、SpringBoot使用

文章目录

  • [1. 概述](#1. 概述)
  • [2. 安装配置](#2. 安装配置)
  • [3. 自定义拆分文本](#3. 自定义拆分文本)
  • [4. 调用](#4. 调用)
    • [4.1 拆分规则](#4.1 拆分规则)
    • [4.2 Rest 调用](#4.2 Rest 调用)
    • [4.3 SpringBoot 调用](#4.3 SpringBoot 调用)

1. 概述


IK分词器是ElasticSearch(es)的一个最最最有名插件,能够把一段中文或者别的语句划分成一个个的关键字,进而在搜索的时候对数据库中或者索引库数据进一个匹配操作

举个小例子,可以将计算机科学与技术学院更细致的拆分为计算机、计算 、算机 、科学、与、技术、学院 、技术学院 ... 等等

2. 安装配置


注意版本的对应,必须保证ik分词器和es是同一个版本

下载链接:ik分词器GitHub地址

Elasticsearch7.6.2\plugins目录下新建ik目录,将压缩包解压

重启elasticsearchkibana,可以看到ik分词器已经被加载

3. 自定义拆分文本


有的时候,ik分词器拆分出来的词语并不是我们想要的,或者说拆分出来的词语不够我使用,此时便可以自定义拆分文本

第一步,首先在Elasticsearch7.6.2\plugins\ik\config目录下新建一个文本文件,命名为.dic后缀的文件,例如我命名为myWord.dic

第二步,打开自定义的dic文件,在其中编写你需要的词语(千万注意,这里要将文件的编码选择为UTF-8,否则无法正确识别

第三步,打开Elasticsearch7.6.2\plugins\ik\config目录下的IKAnalyzer.cfg.xml文件,将自定义的dic文件写入

第四步,重启eskibana,可以看到es已经重新加载了我们自定义的dic文件

4. 调用


4.1 拆分规则


ik分词器拥有两种拆分规则,分别为ik_smartik_max_word

ik_smart:粗糙的拆分,列举常见的拆分

bash 复制代码
GET _analyze
{
  "analyzer": "ik_smart",
  "text": "计算机科学与技术学院"
}

ik_max_word:最细致划分,列举所有的可能

bash 复制代码
GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "计算机科学与技术学院"
}

4.2 Rest 调用


利用rest风格,可以在创建索引时指定分词器

bash 复制代码
PUT /test2
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age":{
        "type": "long"
      },
      "desc":{
        "type": "text"
        "analyzer":"ik_max_word",
      }
    }
  }
}

4.3 SpringBoot 调用


也可以在SpringBoot中指定分词器,前提是记得导入相关es依赖

java 复制代码
//创建使用ik分词器的索引
void createIndexWithIK() throws IOException {
    //1、创建索引请求(这里千万要注意,创建的索引都要求小写)
    CreateIndexRequest request = new CreateIndexRequest("test_index");
    XContentBuilder mappingBuilder = XContentFactory.jsonBuilder();
    mappingBuilder.startObject();
    {
        mappingBuilder.startObject("properties");
        {
            // 定义age属性
            mappingBuilder.startObject("age");
            {
                mappingBuilder.field("type", "integer");
            }
            mappingBuilder.endObject();

            // 定义name属性
            mappingBuilder.startObject("name");
            {
               // 使用keyword类型,不进行分词
                mappingBuilder.field("type", "keyword"); 
            }
            mappingBuilder.endObject();

            // 定义desc属性
            mappingBuilder.startObject("desc");
            {
                mappingBuilder.field("type", "text");
                mappingBuilder.field("analyzer", "ik_max_word"); // 设置使用 IK 分词器
            }
            mappingBuilder.endObject();
        }
        mappingBuilder.endObject();
    }
    mappingBuilder.endObject();

    // 2、将映射添加到索引请求中
    request.mapping(mappingBuilder);
    //3、客户端执行请求(使用默认的请求参数),获得请求后的响应
    CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
    System.out.println(response.isAcknowledged());
}

查看索引是否创建成功

相关推荐
架构源启8 小时前
文档接入与智能解析:基于 Spring AI 1.1.x 的多格式解析、版面理解与结构化抽取
java·人工智能·spring
大模型码小白12 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
名字还没想好☜13 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
音符犹如代码13 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·spring boot·guava
前端炒粉13 小时前
手撕小汇总
java·前端·javascript
唐青枫14 小时前
Java Kafka 实战指南:从 Topic、分区到 Spring Boot 可靠消息处理
java
leoZ23114 小时前
Git 集成实战完全指南(四):Git 冲突解决
大数据·git·elasticsearch
脱胎换骨-军哥14 小时前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++
我是唐青枫15 小时前
Java Netty 实战指南:从 NIO 线程模型到 TCP 编解码和心跳机制
java·tcp/ip·nio
小白说大模型15 小时前
从向量嵌入到复杂 Agent:LLM、LangChain、LangGraph 完整科普
java·开发语言·人工智能·gpt·深度学习·langchain