ElasticSearch学习笔记(四) IK分词

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
应用实时监控服务-用户体验监控,每月100OCU免费额度
可观测监控 Prometheus 版,每月50GB免费额度
简介: 前面了解了Elasticsearch中对索引及文档的基本操作。今天了解Es中非常重要的一个概念:分词。在 Elasticsearch 中,中文分词的首选分词器是 ik 分词器。在本文中,我们将介绍如何使用 ik 分词器将商品名称(name)字段进行分词,并详细介绍分词过程及结果等。

前面了解了Elasticsearch中对索引及文档的基本操作。今天了解Es中非常重要的一个概念:分词。在 Elasticsearch 中,中文分词的首选分词器是 ik 分词器。在本文中,我们将介绍如何使用 ik 分词器将商品名称(name)字段进行分词,并详细介绍分词过程及结果等。

一、ik分词简介

ik分词是一个中文分词器,是基于lucene开发的开源项目,可以通过Elasticsearch的插件方式集成到Elasticsearch中。相对于其他分词器,ik分词的特点在于:

  1. 更加细致的切分能力
  2. 支持自定义词典
  3. 支持拼音转换
  4. 支持多种分词模式

由于ik分词具有良好的中文分词效果,因此在Elasticsearch中使用ik分词插件进行搜索的应用非常广泛。

二、安装 ik 分词器插件

首先,我们需要安装 ik 分词器插件。进入github中ik分词器的源码地址里下载,https://github.com/medcl/elasticsearch-analysis-ik。我们需要根据Es的版本下载对应的分词包。这里我们下载的是v7.11.2:

image.png

由于前面我们使用Docker安装Elasticsearch时已经将Es的plugins目录映射出来了,这里我们只需要将分词包放到映射出来的plugins目录中,重启 Elasticsearch即可生效。

三、使用介绍

1.分词模式介绍

ik分词器有两种分词模式:ik_max_word和ik_smart模式。

  • "ik_smart":是一种比较快速的分词算法,它会尽可能地将文本切分成一个个意义明确的词语。但是可能会出现一些有歧义的结果。
  • "ik_max_word":是一种更加细致、准确的分词算法,它不仅会将文本切分成一个个意义明确的词语,还会考虑到词语之间的关联性,以保证最大化整体语义的准确性。但是“ik_max_word”分词算法相比于“ik_smart”分词算法在效率上有所降低。

因此,如果你对分词效率有要求,并且可以容忍一定的歧义性结果,可以选择使用“ik_smart”分词算法;如果你更注重分词的准确性,可以选择使用“ik_max_word”分词算法。

最佳实践:两种分词器使用的最佳实践是:索引时用ik_max_word,在搜索时用ik_smart。即:索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。

2.使用示例

在创建商品索引product-test时,需要在商品名称字段上指定使用ik分词器。具体做法如下:

PUT /product-test
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "image": {
        "type": "keyword"
      },
      "price": {
        "type": "float"
      },
      "quantity": {
        "type": "integer"
      }
    }
  }
}

在上述代码中,我们使用了ik_max_word分词器来对商品名称进行分词处理。为了验证商品名称已经正确地使用了ik_max_word分词器进行了分词处理,我们可以通过以下命令获取商品名称字段的分词结果:

POST /product-test/_analyze
{
  "analyzer": "ik_max_word",
  "text": "苹果手机 XR 64G"
}

执行上述命令后,我们可以得到如下的分词结果:

{
  "tokens" : [
    {
      "token" : "苹果",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "苹",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "果",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "手机",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "手",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "机",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 5
    },
    {
      "token" : "xr",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "ENGLISH",
      "position" : 6
    },
    {
      "token" : "64g",
      "start_offset" : 8,
      "end_offset" : 11,
      "type" : "LETTER",
      "position" : 7
    },
    {
      "token" : "64",
      "start_offset" : 8,
      "end_offset" : 10,
      "type" : "ARABIC",
      "position" : 8
    },
    {
      "token" : "g",
      "start_offset" : 10,
      "end_offset" : 11,
      "type" : "ENGLISH",
      "position" : 9
    }
  ]
}

从分词结果可以看出,商品名称被成功地切分成了若干个词汇。

为了演示如何通过分词搜索商品名称,我们往索引中添加一些数据。


POST /product-test/_bulk
{ "index": { "_id": 1 }}
{ "name": "苹果12 Pro Max", "image": "https://images.com/iphone12promax.jpg", "price": 4000, "quantity": 50 }
{ "index": { "_id": 2 }}
{ "name": "Samsung Galaxy S21 Ultra", "image": "https://images.com/SamsungS21.jpg", "price": 5200, "quantity": 100 }
{ "index": { "_id": 3 }}
{ "name": "苹果14 Mini", "image": "https://images.com/iphone14mini.jpg", "price": 5999, "quantity": 200 }
{ "index": { "_id": 4 }}
{ "name": "苹果14 Pro Max", "image": "https://images.com/iphone12promax.jpg", "price": 8999, "quantity": 250 }
{ "index": { "_id": 5 }}
{ "name": "华为Mate 40 Pro", "image": "https://images.com/HuaweiMate40.jpg", "price": 5999, "quantity": 50 }
{ "index": { "_id": 6 }}
{ "name": "小米14", "image": "https://images.com/xiaomi14.jpg", "price": 5999, "quantity": 50 }

我们可以使用以下代码来进行搜索:

GET /product-test/_search
{
  "query": {
    "match": {
      "name": "苹果"
    }
  }
}

执行上述命令后,我们可以得到如下的搜索结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 4.0781574,
    "hits" : [
      {
        "_index" : "product-test",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 4.0781574,
        "_source" : {
          "name" : "苹果14 Mini",
          "image" : "https://images.com/iphone14mini.jpg",
          "price" : 5999,
          "quantity" : 200
        }
      },
      {
        "_index" : "product-test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 3.761748,
        "_source" : {
          "name" : "苹果12 Pro Max",
          "image" : "https://images.com/iphone12promax.jpg",
          "price" : 4000,
          "quantity" : 50
        }
      },
      {
        "_index" : "product-test",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 3.761748,
        "_source" : {
          "name" : "苹果14 Pro Max",
          "image" : "https://images.com/iphone12promax.jpg",
          "price" : 8999,
          "quantity" : 250
        }
      }
    ]
  }
}

从搜索结果可以看出,通过使用ik_max_word分词器对商品名称进行分词处理后,我们可以轻松地将商品名称包含“苹果”的商品搜索出来。 同样 当我们搜索 “14” 的时候 ,我们会把“小米14”、“苹果14 Mini”、“苹果14 Pro Max”的结果搜索出来。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
79 5
|
2月前
|
自然语言处理 Java 网络架构
elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
这篇文章是关于如何自定义Elasticsearch的ik分词器配置以满足特定的中文分词需求。
166 0
elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
|
1月前
|
测试技术 API 开发工具
ElasticSearch的IK分词器
ElasticSearch的IK分词器
61 7
|
2月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
241 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
3月前
|
存储 自然语言处理 关系型数据库
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
聚合、补全、RabbitMQ消息同步、集群、脑裂问题、集群分布式存储、黑马旅游实现过滤和搜索补全功能
|
4月前
|
JSON 自然语言处理 Java
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)
134 1
|
4月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
162 1
|
4月前
|
自然语言处理 Java 索引
ElasticSearch 实现分词全文检索 - delete-by-query
ElasticSearch 实现分词全文检索 - delete-by-query
45 1
|
4月前
|
JSON 自然语言处理 数据库
Elasticsearch从入门到项目部署 安装 分词器 索引库操作
这篇文章详细介绍了Elasticsearch的基本概念、倒排索引原理、安装部署、IK分词器的使用,以及如何在Elasticsearch中进行索引库的CRUD操作,旨在帮助读者从入门到项目部署全面掌握Elasticsearch的使用。
|
4月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】
74 0