elasticsearch加入中文分词器elasticsearch-analysis-ik插件

2023-05-16

前言

    elasticsearch作为一个分布式弹性存储与检索系统,默认是不支持中文分词的,但是呢,这个工作有人做,估计都是中国人做的吧。

    什么是中文分词呢,简单来说,就是将我们的中文句子或者短语拆分成一个一个的可以被人们熟知的小单元。这种拆,不是随便拆,主要是有意义的拆。

    如何有意义,这里就是人为指定了。首先,我们常见的歇后语,成语,三字词语,两字词语,常见地名,国家名称等等都是可以被拆成一个小单元的。

    如其说是拆,倒不如说是合并,因为elasticsearch默认对于中文都是做的单个汉字的拆解,比如:我爱中国->我+爱+中+国,其实中国是国家名,理论上是一体的,应该合并。如果我们按照”中国“这个关键字检索,就不会把这句话检索到,如果使用了中文分词器,那么就可以检索到”中国“了。

准备

    知道了分词器的作用,以及不使用分词器可能带来的结果,我们可以来说说分词器的使用。

    对于elasticsearch来说,最著名的分词器还是ik分词,他与elasticsearch结合的插件名称是elasticsearch-analysis-ik,安装这个分词器很简单,github上的地址是https://github.com/medcl/elasticsearch-analysis-ik,只需要将下载的对应版本zip文件解压缩到elasticsearch安装目录下的plugins目录中名称为ik的目录下即可。ik目录的名称应该是随便定义,但是位置一定是elasticsearch/plugins下面。如果是docker容器,那么他在容器中的位置就是/usr/share/elasticsearch/plugins。

    为了让docker容器在重启之后,可以继续有这个分词器插件,我们可以将plugins目录做一个本地映射。docker-compose.yml配置文件如下所示:

version: '2'
services:
  elastic:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.5
    container_name: elastic
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /data/elastic/plugins:/usr/share/elasticsearch/plugins

     安装插件,还可以通过elasticsearch-plugin这个命令来操作:

[root@084162db0954 elasticsearch]# elasticsearch-plugin --help
A tool for managing installed elasticsearch plugins

Commands
--------
list - Lists installed elasticsearch plugins
install - Install a plugin
remove - removes a plugin from Elasticsearch

Non-option arguments:
command              

Option         Description        
------         -----------        
-h, --help     show help          
-s, --silent   show minimal output
-v, --verbose  show verbose output
[root@084162db0954 elasticsearch]# elasticsearch-plugin list  
ik
[root@084162db0954 elasticsearch]# 

    具体的安装,应该是:

elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.5/elasticsearch-analysis-ik-6.8.5.zip 

    这样安装,应该也是跟手动放到plugins目录下效果是一样的,不管怎么样,地址都是github,所以速度都会很慢。 

    加入这个插件,并不表示我们手动构建的索引就支持中文分词,还需要做设置。

验证

    为了验证分词器的效果,我们需要构建两次索引,第一次采用默认分词器,第二次使用中文分词器。

    这里以movies为索引名称,movie为索引type,构建并查询。

    以下是文档数据:

{
    "name": "唐人街探案",
    "desc": "发生在唐人街的喜剧与悬疑故事"
}								
{
    "name": "发财日记",
    "desc": "王一山主演的穷小子混迹都市的故事"
}
{
    "name": "沐浴之王",
    "desc": "乔杉主演将兄弟澡堂开到拉斯维加斯的励志故事"
}

    构建索引:

    

    插入文档数据:

    1 发财日记

    

    2 唐人街探案

    

    3 沐浴之王

    

    查看全部文档:

    

    关键字检索:故事

    

    没有使用中文分词器存储与检索,所以按照故事检索,没有找到文档。但是如果按照单个的字,按照“事”来检索,则出现全部结果:

    

    ===============================================================

     以上验证了一个问题,不使用中文分词,那么所有的中文都拆分为了一个一个的汉字,这是最小的拆分单元,我们只能按照单个字检索,显然不能满足海量数据的检索要求。

    下面利用中文分词作存储与检索来看看效果。

    索引需要重建,所以我们需要删除刚才的索引以及数据:

    

    新建索引,指定字段使用的分词器:下面这段配置是通过json形式发送给elasticsearch的http请求的data部分。

{
	"mappings":{
		"movie":{
			"dynamic":false,
			"properties":{
				"name":{"type":"keyword"},
				"desc":{"type":"text","analyzer":"ik_max_word","search_analyzer":"ik_max_word"}
			}
		}
		
	}
}

    

    还是利用post请求,插入三条刚才的文档数据,这里不再重复贴图了。

    查询文档,还是通过关键字“故事”检索:

    

    这次把三个文档数据全都查出来了,与刚才的结果对比,说明中文分词生效了。

    再看看其他的关键字检索效果:

    

    以上通过截图的方式展示了中文分词在elasticsearch中的使用以及效果。

    我们得到的结论是:

    1、elasticsearch默认不支持中文分词,但是中文句子被拆成了一个一个的汉字,可以按照汉字进行检索,对于少量文字没有问题,但是海量应用就很糟糕了。

    2、ik分词的使用,需要在索引创建的时候指定字段属性 analyzer与search_analyzer均为ik_max_word。

    3、ik分词是将常见的词语在拆的时候做了合并,最小单元不再全部是汉字。

    其实可以大胆的猜测,中文分词器,其实就是做了一个词典,将两字词语,三字词语,四字成语,短语,以及歇后语全部收纳,常见的人名,比如孔子,李白等等也进行了收集,这个词典也不是一成不变的,随着时间的推移,内容也会发生改变。

    在ik插件目录中,有一个config文件夹,里面全部是各种dic文件,这就是“词典”:

    太厉害了,这个工作量巨大的任务总有一些默默无闻的人做,非常感谢他们的付出, 前人栽树,后人乘凉,这些人的精神总在激励我们这些懒人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

elasticsearch加入中文分词器elasticsearch-analysis-ik插件 的相关文章

  • tmux基本操作

    tmux是什么 tmux xff08 terminal multiplexer xff09 是Linux上的终端复用神器 xff0c 可从一个屏幕上管理多个终端 xff08 准确说是伪终端 xff09 使用该工具 xff0c 用户可以连接或
  • css小技巧之浮动,居中,周围阴影,relative妙用

    css在布局和样式微调中 xff0c 有很多小技巧 xff0c 今天总结一些小妙招 xff0c 这些方法基本上很好用 xff0c 而且不会轻易弄混淆 我们为了看出效果 xff0c 将页面做了一些修饰 xff0c 比如很多地方加上了边框 xf
  • react+antd动态表单以及数组对象示例

    在实际开发中 xff0c 我们会遇到表单中有些数据项是多个 xff0c 并不是普通的一个值 xff0c 或者一组值 xff0c 而是一个数组 xff0c 比如联系人这一项 xff0c 我们通常会有多个联系人 xff0c 这时候 xff0c
  • notepad++安装c/c++简单编程开发环境

    notepad 43 43 作为一个常用的编辑器 xff0c 加上一些插件可以很方便的作为一个简易的编译运行环境 xff0c 说是简易 xff0c 是因为运行简单的程序或者demo可以很方便 xff0c 如果大型的项目 xff0c 还是通过
  • 去掉webpack脚手架构建的vue项目中的eslint检查

    eslint是一个语法格式检测的工具 xff0c 对于规范开发有好处 xff0c 培养严格的书写习惯 xff0c 但是对于新手来说 xff0c 非常的痛苦 xff0c 有时候没有语法错误 xff0c 仅仅是格式中tab space区分不严格
  • Vue中百度地图的应用

    百度地图对于vue项目也做了依赖 xff0c 他就是vue baidu map xff0c 我们在vue项目中 xff0c 只需要安装vue baidu map依赖即可使用 xff0c 另外 xff0c 百度地图javascript api
  • React Hook “useState“ is called in function “xxx“ which is neither a React function component or解决办法

    如题所示 xff0c 在React开发中 xff0c 我们会自定义一些函数 xff0c 比如hook函数 xff0c 或者组件 xff0c 当我们使用了useState useEffect等这些hook函数的时候 xff0c 可能会报错 x
  • electron+vue项目安装vue-devtools插件

    这里记录一下自己安装过程中遇到的问题 xff1a 1 首先需要安装vue devtools xff0c 遇到了源码编译构建的时候的webpack webpack cli反复提示缺失的问题 这个问题很烦 a git clone https g
  • vue+vuetify表格控件v-data-table使用自定义列渲染

    这里先说明一下vue项目中使用vuetify框架进行整合的办法 xff1a 1 加入依赖 npm install vuetify save 2 加入开发依赖 npm install sass sass loader deepmerge sa
  • vue+vuetify构建简单消息确认框

    vue框架自己好像没有弹出框 xff0c 而vuetify有弹出框v dialog xff0c 没有确认框confirm xff0c 虽然确认框本身就是弹出框 xff0c 但是弹出框的功能有个特点 xff0c 就是确定做一件事情 xff0c
  • docker-compose构建mysql服务

    docker安装mysql服务显得很快捷 xff0c 我们如果使用了docker compose那就更快了 xff0c 我们只需要按照我们的要求 xff0c 设置相应的端口映射 xff0c 如果有需求 xff0c 也可以设置数据映射 配置如
  • Nginx核心模块内置变量

    本文根据Nginx官网整理了Nginx的ngx http core module模块的内置变量 xff0c 可与Apache做对比参考 随后做了一次测试观察各变量的值 xff0c 并附上测试结果 1 变量列表 arg name 请求行中参数
  • js属性名用变量代替

    在前端中 xff0c 我们有时候需要利用变量名来设置属性名 xff0c 虽然不是很常见 xff0c 但是也是一个应用场景 这时候 xff0c 我们如果想当然的 xff0c 直接使用变量来设置 xff0c 那么可能不会达到我们想要的结果的 我
  • nodejs利用ffi库调用windows系统user32库函数获取桌面程序窗口大小

    ffi库是npm提供的操作windows系统库函数的依赖库 xff0c 安装过程会比较麻烦 xff0c 需要编译 xff0c 可能需要npm全局安装windows build tools xff0c 如何安装 xff0c 可以参照这里 这篇
  • nodejs利用ffi库调用windows系统user32函数模拟用户登录操作

    如题所示 xff0c 一般的桌面程序 xff0c 用户登录很简单 xff0c 就是找到用户名和密码输入框 xff0c 输入相应的用户名和密码 xff0c 然后点击 登录 按钮 xff0c 完成登录操作 这是人为操作的步骤 xff0c 如果这
  • 通过vue指令创建electron-vue模板项目出现一直“downloading template“问题

    今天试了一下 xff0c vue init simulatedgreg electron vue vueapp的时候 xff0c 在命令行下一直downloading template xff0c 让我很懊恼 原来vue init创建的时候
  • electron-vue与vuetify整合出现报错:If you‘re seeing “$attrs is readonly“

    如题所示 xff0c 正常情况下electron vue与vuetify的整合 xff0c 因为就是vue与vuetify的整合 xff0c 按照一般的推荐方法 xff0c 基本不会出错 xff0c 但是 xff0c 这里因为electro
  • VISA编程实例(C实现)

    今天写这个文章 xff0c 是因为自己工作中用到了ROHDE amp SCHWARZ xff08 即罗德 施瓦茨公司 xff09 的仪表设备 xff0c 需要通过编程的方式来读取仪表上功率测试结果 xff0c 本来仪表上显示了测试结果 xf
  • mac下通过gcc命令手动编译动态链接库示例

    编译动态链接库 xff0c windows linux mac平台各不相同 xff0c 从文件上来说 xff0c windows下是dll xff0c linux下是so xff0c mac下是dylib xff1b 命令上也会有区别 xf
  • c++中char[]与char*的转换以及char*与数字互转

    在c c 43 43 中 xff0c 字符串操作不可避免 xff0c 而且通常 xff0c char 或者char 就能表示字符串 xff0c 这个跟java语言有很大的差别 xff0c java中char是字符 xff0c string才

随机推荐

  • electron项目构建打包缺少dll文件的问题解决办法

    最近 xff0c 在做electron项目中 xff0c 使用了第三方dll xff0c 开发环境运行一切正常 xff0c 可是当我们打包 xff0c 最后生成的可执行程序再执行 xff0c 发现调用dll总是不成功 xff0c 猜测是少了
  • c/c++中的回调函数

    c c 43 43 中的回调函数是一个很奇怪的东西 xff0c 在java中 xff0c 方法调用的时候 xff0c 参数最多可以传入另一个对象实例 xff0c 然后在方法体内 xff0c 调用实例的方法 xff0c 做不到方法调用的时候
  • 在Windows下配置多个git账号

    本文记录在Windows下配置两个github账号的过程 1 生成并部署SSH key 安装好Git客户端后 xff0c 打开git bash xff0c 输入以下命令生成user1的SSH Key xff1a ssh keygen t r
  • windows命令行下通过cl命令编译动态链接库示例

    一般在windows下写一个c c 43 43 的动态链接库 xff0c 我们都是在visual studio或着visual c 43 43 这些ide里面进行编译和生成的 xff0c 今天介绍 xff0c 如何通过命令行来实现手动编译和
  • gdb命令调试c程序

    一般开发c语言程序 xff0c 都是在ide中编码 xff0c 调试也是使用集成环境 xff0c 有时候 xff0c 我们的程序是在文本编辑器中编写的 xff0c 这时候可能使用gcc编译 xff0c 然后运行可执行程序 遇到需要调试的场景
  • 选择排序算法与示例详解(c语言)

    选择排序是排序算法的一种 xff0c 思想就是 xff0c 每一轮寻找数组中最大的值或者最小的值 xff0c 放在头部或者放入一个新的数组 这样经历一轮遍历 xff0c 数组或者新数组就是排好序的 xff0c 他的目的很明确 xff0c 每
  • 2020年csdn盘点

    十年前就注册了csdn账号 xff0c 之后一直没有写过博客 xff0c 都是看别人的博客 xff0c 等到2015年左右发表了第一篇自己的博客 xff0c 直到2016年底觉着做技术的就需要记录自己的博客 xff0c 不仅是自己学习的过程
  • chrome浏览器安装react-devtools

    react devtools是react开发时的一个浏览器插件 xff0c 对于各大主流高级浏览器都有扩展程序可以安装 xff0c 官方的地址默认是https github com facebook react devtools xff0c
  • react+typescript项目构建

    react项目构建可以很简单 xff0c 但是如果是结合typescript xff0c 其实也不是很麻烦 xff0c 官网也有很明确的说明 有两种办法 xff1a 1 直接构建带有typescript的react项目 xff0c 我们需要
  • react项目启动报错:Uncaught TypeError: Cannot read property ‘forEach‘ of undefined

    如题 xff0c react项目启动报错 xff0c 具体信息 xff0c 如下所示 xff1a 这个问题是因为浏览器安装了react devtools扩展程序导致的 xff0c 很多人的解决办法就是直接禁用react devtools x
  • react组件之间传值

    看过一些文章介绍react组件之间传值 xff0c 无外乎以下几种情况 xff1a 父子组件之间相互传值 xff0c 兄弟节点之间传值 最常见的就是父子组件 xff0c 做法也很简单 xff1a 就是在父组件中直接通过props属性的方式将
  • 利用mocha进行以太坊智能合约编译部署测试

    使用智能合约编程语言solidity编写的智能合约 xff0c 除了可以直接通过以太坊的工具链truffle ganache cli进行测试之外 xff0c 还可以结合mocha进行单元测试 mocha单元测试本质上 xff0c 还是需要对
  • electron报错:Uncaught Error: A dynamic link library (DLL) initialization routine failed

    如题所示 xff0c 我们在进行node 43 electron开发桌面应用的时候 xff0c 经常会遇到这样的问题 xff1a 根据提示是因为ref依赖模块没有合适的编译版本 xff0c 但是我们进行npm install的时候没有报错啊
  • C语言 利用冒泡排序法对10个字符由小到大排序

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • truffle+ganache-cli构建简单以太坊智能合约并编译部署

    以前接触过以太坊工具链来做区块链练手项目 xff0c 后来荒废了 xff0c 如今再次捡起来 xff0c 算是回忆和加深 之前可能因为网络的原因 xff0c 在truffle各种初始化编译合成智能合约都遇到了好多问题 xff0c 如今再次尝
  • docker-compose搭建mongo+elasticsearch+graylog运行环境

    graylog是一个小型的开源日志收集 分析 展示框架 主要graylog运行需要mongo elasticsearch xff0c 所以他们就组成了一个小的整体 一般在虚拟机上搭建 xff0c 可以分开安装部署 xff0c 但是既然是一个
  • word文档中插入图片显示不全解决办法

    在windows下写word文档 xff0c 正常情况下 xff0c 我们应该不会遇到插入图片显示不全的问题 xff0c 好像是如果在已有的文档中插入图片 xff0c 比如文档中间插入 xff0c 图片没办法自动扩展空间 xff0c 这就导
  • quasar构建linux版本electron项目以及如何让electron程序在linux下运行

    quasar构建 xff0c 默认命令是 xff1a quasar build m electron 如果要支持linux xff0c 通常是直接加参数 target linux或者简写 T linux quasar build m ele
  • docker容器改变时区

    默认情况下的docker容器启动之后 xff0c 系统时间是UTC时间 xff0c 这导致和我们的北京时间相差8小时 xff0c 会引出很多问题 有一些容器是和项目一起构建的 xff0c 我们可以在构建的时候 xff0c 将系统时区修改为A
  • elasticsearch加入中文分词器elasticsearch-analysis-ik插件

    前言 elasticsearch作为一个分布式弹性存储与检索系统 xff0c 默认是不支持中文分词的 xff0c 但是呢 xff0c 这个工作有人做 xff0c 估计都是中国人做的吧 什么是中文分词呢 xff0c 简单来说 xff0c 就是