当前位置:   article > 正文

ES之道:IK分词器的魔法般变身_ik 分词器介绍

ik 分词器介绍

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

前言

在数据的世界里,搜索就像是一位智慧的导航员,它能够帮助我们在海量信息中找到需要的答案。而Elasticsearch,就像是这位导航员的得力助手,它通过强大的文本处理能力,为我们提供了一个高效的搜索引擎。而IK分词器,则是Elasticsearch中的一枚利器,它能够帮助我们实现中文文本的精确分词和搜索。今天,就让我们一起来揭开IK分词器的神秘面纱,探索它在Elasticsearch中的魔法般变身吧!

IK分词器简介

IK 分词器是一个针对中文文本的开源分词器,特别适用于中文搜索引擎和文本分析领域。它的作用是将中文文本按照一定的规则进行切分,将连续的字符序列划分为具有语义的词语,从而实现中文文本的分词处理。

重要性:

  1. 中文分词的基础工具: 在中文文本处理领域,分词是非常基础且重要的工作。IK 分词器提供了一个高效准确的分词工具,为中文文本的处理提供了基础支持。
  2. 提高搜索效果: 在搜索引擎等应用中,分词的质量直接影响搜索结果的准确性和用户体验。使用 IK 分词器可以提高搜索引擎的检索效果,使用户能够更快速准确地找到所需信息。
  3. 支持领域专业词汇: IK 分词器支持用户自定义词典,可以灵活地增加领域专业词汇,提高分词的准确性和适用性。

与其他分词器的区别:

  1. 精准度和速度: IK 分词器在中文文本处理领域具有较高的精准度和速度,能够快速准确地进行分词处理。
  2. 自定义词典支持: IK 分词器支持用户自定义词典,可以灵活增加领域专业词汇,提高分词效果。一些其他分词器也支持自定义词典,但不是所有分词器都具备这个功能。
  3. 开源社区支持: IK 分词器是一个开源项目,有着活跃的开发社区和用户社区,可以获得丰富的技术支持和资源共享。

IK分词器原理

IK 分词器的分词原理基于中文文本的规则和词典匹配,主要包括正向最大匹配和逆向最大匹配两种算法。以下是 IK 分词器的基本工作流程:

  1. 正向最大匹配(Forward Maximum Matching):

    • 正向最大匹配从文本的开头开始,按照最大匹配的原则进行切分。即从当前位置开始,选择最长的词语进行匹配,并将匹配成功的词语作为分词结果。
    • 此过程会在词典中查找匹配的词语,如果找到匹配的词语,则将其作为分词结果;如果没有找到匹配的词语,则缩小匹配窗口,继续查找下一个最长的词语。
    • 分词过程会重复执行,直到处理完整个文本。
  2. 逆向最大匹配(Reverse Maximum Matching):

    • 逆向最大匹配从文本的末尾开始,按照最大匹配的原则进行切分。即从当前位置开始,选择最长的词语进行匹配,并将匹配成功的词语作为分词结果。
    • 此过程同样会在词典中查找匹配的词语,如果找到匹配的词语,则将其作为分词结果;如果没有找到匹配的词语,则缩小匹配窗口,继续查找下一个最长的词语。
    • 分词过程会重复执行,直到处理完整个文本。
  3. 合并分词结果:

    • 正向最大匹配和逆向最大匹配得到的分词结果可能不同,因此需要进行合并。
    • 通常情况下,可以选择分词结果中词数较少的作为最终结果,或者根据一定的评分算法来选择最合适的分词结果。
  4. 处理未登录词:

    • IK 分词器支持用户自定义词典,用户可以添加自己的词汇到词典中。当分词器无法识别某些词语时,会尝试在用户词典中查找匹配的词汇。

总体而言,IK 分词器通过正向最大匹配和逆向最大匹配两种算法来切分中文文本,并结合用户自定义词典进行分词处理,从而实现对中文文本的准确分词。

创建索引和配置IK分词器

在 Elasticsearch 中创建索引并配置 IK 分词器,可以通过以下步骤完成:

  1. 创建索引: 首先,在 Elasticsearch 中创建一个新的索引,可以使用 Elasticsearch 的 REST API 或者 Kibana 工具进行操作。

  2. 配置 IK 分词器: 针对需要进行中文分词的字段,配置相应的 IK 分词器。

下面是一个示例,演示如何使用 Elasticsearch 的 REST API 在创建索引时配置 IK 分词器:

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "ik_max_word", // 使用 IK 分词器 ik_max_word
          "filter": ["my_synonym_filter"] // 可选:添加同义词过滤器
        }
      },
      "filter": {
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms_path": "analysis/synonyms.txt" // 同义词文件路径
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "my_analyzer" // 使用自定义的 IK 分词器
      }
    }
  }
}
  • 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

在上面的示例中:

  • 创建了一个名为 my_index 的索引。
  • 在索引的设置中,定义了一个名为 my_analyzer 的分析器,使用 IK 分词器 ik_max_word 进行分词,并且可以选择添加同义词过滤器。
  • 创建了一个 content 字段,并将其配置为使用自定义的 IK 分词器 my_analyzer 进行分词。

常见的 IK 分词器配置示例包括:

  • ik_max_word:最大化地切分词语,适合搜索应用。
  • ik_smart:精准地切分词语,适合索引和分析应用。

根据实际需求,可以选择合适的 IK 分词器进行配置,并根据需要添加额外的分词器设置,如同义词过滤器等。

实战(docker搭建的Es)

下载ik插件

docker搭建的Es如果下载ik分词器插件可以执行以下命令,下面的版本要选择你的es版本

docker exec -it your_elasticsearch_container_name /bin/bash -c "elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.16.3/elasticsearch-analysis-ik-7.16.3.zip"
  • 1

创建一个ik分词器的索引

curl -XPUT "http://localhost:9200/acowbo_new" -H 'Content-Type: application/json' -d '
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase"]
        },
        "ik_analyzer": {
          "type": "custom",
          "tokenizer": "ik_smart"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "searchKey": {
        "type": "text",
        "analyzer": "ik_analyzer"
      },
      "searchValue": {
        "type": "text",
        "analyzer": "ik_analyzer"
      },
      "typeName": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}'
  • 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

如果希望将原来的索引覆盖

重新索引数据
curl -XPOST "http://localhost:9200/_reindex" -H 'Content-Type: application/json' -d '
{
  "source": {
    "index": "acowbo"
  },
  "dest": {
    "index": "acowbo_new"
  }
}'

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
删除旧索引重新命名新索引
curl -XDELETE "http://localhost:9200/acowbo"
curl -XPOST "http://localhost:9200/acowbo_new/_alias/acowbo"
  • 1
  • 2

报错解决

  1. Can’t update non dynamic settings [[index.analysis.analyzer.my_analyzer.type, index.analysis.analyzer.my_analyzer.filter, index.analysis.analyzer.ik_analyzer.tokenizer, index.analysis.analyzer.my_analyzer.tokenizer, index.analysis.analyzer.ik_analyzer.type]] for open indices

    Elasticsearch不允许直接更新这些非动态设置。
    curl -XPOST "http://localhost:9200/acowbo/_close"
    
    • 1
    • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/966599
推荐阅读
相关标签
  

闽ICP备14008679号