elasticsearch笔记之ik分词器详解

一、ik分词器是什么?

我们都知道,在平时使用搜索引擎搜索东西的时候,我们自己输入的关键字,有可能会被分隔成好几个字或者词,最常见的比如我们使用百度搜索关键字的话,那么所有与该关键字相关的都会显示出来,并把出现关键字的文档标红,而且单条记录可能出现多个标红,如图所示
在这里插入图片描述
或者像这样的。,但凡与你的。
或者像这样的,但凡文档当中出现了一个或者多个与搜索的关键相匹配的文本,都会被标红。
在这里插入图片描述

于是乎,今天我们的主角闪耀登场了,他就是elasticsearch中的ik分词器

二、使用步骤

1.开启服务

在使用ik分词器之前,我们需要首先开启elasticsearch服务,然后为了演示ik分词器的展示效果,还需要下载kibana,用于操作并且查看elasticsearch里面的数据。
elasticsearch下载地址
在这里插入图片描述
kibana下载地址
在这里插入图片描述
下载完成后,我把他们放在同一个目录里面了。
在这里插入图片描述
接下来进入elasticsearch的bin目录,单击运行,也是es就启动起来了。
在这里插入图片描述
然后开启kibana服务,并且单击运行,kibana服务就启动起来了。
在这里插入图片描述

验证

浏览器输入http://localhost:9200/验证是否开启了elasticsearch服务。
在这里插入图片描述
浏览器输入http://localhost:5601看看是否能够进入kibana页面
在这里插入图片描述

支持准备工作就已经做好了,那么接下来我们演示一下如何进行ik分词器的操作,以及如何自定义ik分词器,以能够实现我们想要的功能。

2.ik分词器演示

在ik分词器有两种模式,那么他们之间有什么样的区别呢?我们通过代码来演示一下。

  • ik_smart
  • ik_max_word
    在这里插入图片描述
    首先演示一下ik_smart,在屏幕左边输入以下命令。
GET _analyze
{
    
    
  "analyzer":"ik_smart",
  "text":"五星红旗"
}

右边就能够查询到对应的结果。

{
    
    
  "tokens" : [
    {
    
    
      "token" : "五星红旗",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 0
    }
  ]
}

在这里插入图片描述
那我们使用ik_max_smart又会怎么样呢?

GET _analyze
{
    
    
  "analyzer":"ik_max_word",
  "text":"五星红旗"
}

返回结果如下,这就很明显了,elasticsearch会把所有可能的结果都显示出来。

扫描二维码关注公众号,回复: 12643857 查看本文章
{
    
    
  "tokens" : [
    {
    
    
      "token" : "五星红旗",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
    
    
      "token" : "五星",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
    
    
      "token" : "五",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "TYPE_CNUM",
      "position" : 2
    },
    {
    
    
      "token" : "星",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 3
    },
    {
    
    
      "token" : "红旗",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 4
    }
  ]
}

在这里插入图片描述
那么问题来了,我现在想要实现另外一种功能,假如我把某个人的名字输入进去,然后使用ik_max_smart模式来运行的话,它是不是会把名字也给拆开呢?(实际上我们并不想要这样的效果,我们想要的是不把名字分开)

GET _analyze
{
    
    
  "analyzer":"ik_max_word",
  "text":"廖晨威大四了"
}
{
    
    
  "tokens" : [
    {
    
    
      "token" : "廖",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
    
    
      "token" : "晨",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
    
    
      "token" : "威",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 2
    },
    {
    
    
      "token" : "大四",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
    
    
      "token" : "四",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "TYPE_CNUM",
      "position" : 4
    },
    {
    
    
      "token" : "了",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "CN_CHAR",
      "position" : 5
    }
  ]
}

在这里插入图片描述
那么这个问题如何去解决呢?我们想要名字可以不拆开,其实很简单,我们只需要在elasticsearch的ik分词器插件当中加入我们想要达到的效果即可。

对应的目录如下
在这里插入图片描述
在下面的目录里面新建一个后缀为.dic的文件,并且往这个文件里面加入自己的名字(廖晨威),然后在IKAnalyzer.cfg.xml配置文件当中加入这个.dic文件即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此,扩展功能已经完成了,那么接下来我们需要重新开启一下es服务。

总结

至此,ik分词器的讲解已经完毕了,如果以后我们需要自定义一些自己需要的词汇,为了在搜索的时候,别把关键字拆开,那么就可以自定义扩展词汇。嘿嘿,原来如此简单!

猜你喜欢

转载自blog.csdn.net/qq_41486775/article/details/114093829