IK分词器安装、配置、分词自定义、Rest使用、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:粗糙的拆分,列举常见的拆分

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "计算机科学与技术学院"
}

在这里插入图片描述

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

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "计算机科学与技术学院"
}

在这里插入图片描述

4.2 Rest 调用


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

PUT /test2
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age":{
        "type": "long"
      },
      "desc":{
        "type": "text"
        "analyzer":"ik_max_word",
      }
    }
  }
}

4.3 SpringBoot 调用


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

//创建使用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());
}

查看索引是否创建成功

在这里插入图片描述

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring Boot使用IK分词器,您可以按照以下步骤进行操作: 1. 在pom.xml中添加以下依赖项: ```xml <dependency> <groupId>com.github.ylz19980205</groupId> <artifactId>elasticsearch-analysis-ik</artifactId> <version>7.10.2</version> </dependency> ``` 2. 创建一个配置类,实现`org.elasticsearch.index.analysis.AnalysisProvider`接口,以提供自定义IK分词器配置。例如: ```java @Configuration public class IKAnalyzerConfig { @Bean(name = "ikTokenizer") public Tokenizer getIkTokenizer() { return new IKTokenizer(); } @Bean(name = "ikTokenFilter") public TokenFilter getIkTokenFilter() { return new IKTokenFilter(); } @Bean(name = "ikAnalyzer") public Analyzer getIkAnalyzer() { return new Analyzer() { @Override protected TokenStreamComponents createComponents(String fieldName) { Tokenizer tokenizer = getIkTokenizer(); TokenFilter tokenFilter = getIkTokenFilter(); return new TokenStreamComponents(tokenizer, tokenFilter); } }; } private static class IKTokenizer extends Tokenizer { private final IKSegmenter ikSegmenter; public IKTokenizer() { this.ikSegmenter = new IKSegmenter(input, true); } @Override public boolean incrementToken() throws IOException { // 实现自定义分词逻辑 // ... } } private static class IKTokenFilter extends TokenFilter { private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); protected IKTokenFilter(TokenStream input) { super(input); } @Override public boolean incrementToken() throws IOException { // 实现自定义过滤逻辑 // ... } } } ``` 3. 在应用程序中使用自定义IK分词器,例如: ```java @Autowired private Analyzer ikAnalyzer; // 使用IK分词器进行分词 public List<String> analyze(String text) throws IOException { List<String> result = new ArrayList<>(); TokenStream tokenStream = ikAnalyzer.tokenStream("text", text); tokenStream.reset(); while (tokenStream.incrementToken()) { CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class); result.add(charTermAttribute.toString()); } tokenStream.end(); tokenStream.close(); return result; } ``` 这是一个简单的示例,您可以根据自己的需求进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值