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

2024-05-10 21:04

本文主要是介绍ES之道:IK分词器的魔法般变身,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


在这里插入图片描述

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

    • 前言
    • IK分词器简介
    • IK分词器原理
    • 创建索引和配置IK分词器
    • 实战(docker搭建的Es)
      • 下载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 分词器}}}
}

在上面的示例中:

  • 创建了一个名为 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"

创建一个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"}}}
}'

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

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

报错解决

  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"
    

这篇关于ES之道:IK分词器的魔法般变身的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977545

相关文章

es安装教程

环境介绍# 软件版本:ElasticSearch7.0.0 Kibana7.0.0 系统环境:mac 环境 安装过程# 官网下载 ElasticSearch7.0.0 版本,下载后解压即可 进入es安装目录 cd elasticsearch-7.0.0bin/elasticsearch 如果报错的话直接给整个目录增加读写权限 在页面中访问 http://localhost:920

架构整洁之道(架构篇)

只有顺心意,才能逆天命 --猫腻《择天记》 接上文:架构整洁之道(原则篇) 1.什么是软件架构什么是软件架构?“软件架构师”的工作内容是什么?软件架构设计的目标? 2.重复3.划分边界4.尖叫的软件架构 5.整洁架构5.1 业务实体5.2 用例5.3 接口适配器5.4 框架与驱动程序 6.解耦谬论 欢迎关注微信公众号“江湖喵的修炼秘籍” 1.什么是软件架构

读书·架构整洁之道(原则篇)

十四年不修行,只读书,一年通幽。二十日不解碑,只静坐,一日看尽前陵碑 ----- 猫腻《择天记》 一.设计与架构究竟是什么?二.SOLID设计原则SRP:单一责任原则(Single Responsibility Principle)OCP:开闭原则(Open Closed Principle)LSP:里氏替换原则(Liskov Substitution Principle)ISP

def __init__ python特殊方法(也称为魔法方法或双下划线方法)

这些特殊方法(也称为魔法方法或双下划线方法)是由 Python 的数据模型(data model)规定的,用于定义对象的行为。它们通常用于实现内置操作和函数的行为,如算术运算、比较操作、容器类型(如列表和字典)的行为等。 特殊方法的命名规定 这些方法的名字都是由 Python 语言规范规定的,以下是一些常见的特殊方法及其用途: 对象表示 __str__(self):定义当使用 str()

OpenGL-ES 学习(6)---- 立方体绘制

目录 立方体绘制基本原理立方体的顶点坐标和绘制顺序立方体颜色和着色器实现效果和参考代码 立方体绘制基本原理 一个立方体是由8个顶点组成,共6个面,所以绘制立方体本质上就是绘制这6个面共12个三角形 顶点的坐标体系如下图所示,三维坐标的中心原点位于立方体的中心,但是要特别注意的是,前后方向表示的是Z轴,上下方向表示的是Y轴 立方体的顶点坐标和绘制顺序 立方体坐标定义

发软文的平台有哪些:一文解锁您的营销之道

软文营销已经成为品牌推广、产品介绍和市场营销的重要一环。选择合适的平台来发布软文,不仅能够有效提升品牌曝光度,还能精准触达目标用户,增强品牌影响力。那么,发软文的平台有哪些呢?本文将为您详细介绍几个主流的平台,助您在软文营销的道路上事半功倍。 一、微信公众号 作为国内最大的社交媒体平台之一,微信公众号拥有庞大的用户基础和高度活跃的粉丝群体。通过注册公众号并发布优质内容,您可以轻松将软文传播给粉

高考专业与学校选择之道。这个标题简洁明了,概括了文章的主要内容,同时突出了文章的主题。

随着24年高考帷幕的落下,许多考生正在面临一场新的思考与选择。对于我来说,高考不仅仅是关于分数,更是关于未来的方向和选择。专业和学校,这两个前置选项犹如“鱼与熊掌”,有时难以兼得。然而,在我看来,选择专业和学校都是开启大学新生活的重要步骤,需要慎重考虑。  首先,对于我来说,专业选择的重要性不言而喻。它不仅直接影响着未来的职业发展,更关乎个人的兴趣和热情。我坚信,只有热爱,才能让我在专业领域中

Python协程探秘:async/await的魔法

Python协程探秘:async/await的魔法 在Python的并发编程世界中,协程(Coroutines)和async/await关键字正逐渐崭露头角,它们提供了一种高效、轻量级的并发解决方案。本文将深入解释协程的概念,探讨async/await关键字的作用,并通过示例展示如何在Python中使用它们。 一、协程简介 协程,又称为微线程(Microthreads)或用户态线程(User

ES单条数据录入操作

录入数据时先在库里进行查询,如果数据存在的话,进行更新数据;如果库里面此条数据不存在的话,进行插入数据以下是封装的完整代码可以参考 from elasticsearch import Elasticsearchurl = 'http://%s:%s/' % ('ip', 'port')ES = Elasticsearch(url)query = {"query": {"bool": {"mus

Es项目关于数据库和es数据同步问题解决

Es项目关于数据库和es数据同步问题解决 方法 项目拆分成两个模块,(一个模块用作数据修改和写入数据库,另一个模块只用于数据读取和同步,读取和同步模块使用只调用和同步es)用户新增修改数据库成功后调用es同步微服务模块,es同步成功后再返回给用户处理结果。 方法优点 : 实现简单 方法缺点 :项目耦合度高,耗费时间长 两个模块之间添加一个mq中间件,用户修改或者新增数据到数据库的时候,直接