Docker环境下配置Es自定义分词器(ik)

news2024/11/17 11:31:07

分词

一个 tokenizer(分词器)接收一个字符流,将之分割为独立的 tokens(词元,通常是独立 的单词),然后输出 tokens 流。 例如,whitespace tokenizer 遇到空白字符时分割文本。它会将文本 "Quick brown fox!" 分割 为 [Quick, brown, fox!]。 该 tokenizer(分词器)还负责记录各个 term(词条)的顺序或 position 位置(用于 phrase 短 语和 word proximity 词近邻查询),以及 term(词条)所代表的原始 word(单词)的 start(起始)和 end(结束)的 character offsets(字符偏移量)(用于高亮显示搜索的内容)。

Elasticsearch 提供了很多内置的分词器,可以用来构建 custom analyzers(自定义分词器)

 1)、安装 ik 分词器

注意:不能用默认 elasticsearch-plugin install xxx.zip 进行自动安装

找到github上的开源分词器插件

Releases · medcl/elasticsearch-analysis-ik · GitHubThe IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary. - Releases · medcl/elasticsearch-analysis-ikhttps://github.com/medcl/elasticsearch-analysis-ik/releases?after=v6.4.2&page=8

找到对应的Es对应的版本,一定要找对应的版本,不然会出现一些乱七八糟的错误

 下载elasticsearch-analysis-ik-7.4.2.zip 

 下载完解压以后传到虚拟机对应Docker中对应的Es挂载的插件位置

 将文件命名为ik

 检查是不是安装好了,进入Es容器内部

docker exec -it 容器 id /bin/bash

即可列出系统的分词器 

elasticsearch-plugin list

 最后记得Es容器

 2)、测试分词器

使用默认

POST _analyze
{
  "text": "我是中国人"
}
{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "中",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "国",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "人",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    }
  ]
}

使用分词器 

POST _analyze
{
  "analyzer": "ik_smart",
  "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" : 5,
      "type" : "CN_WORD",
      "position" : 2
    }
  ]
}

另外一个分词器ik_max_word

POST _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" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "中国",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "国人",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 4
    }
  ]
}

结论 

能够看出不同的分词器,分词有明显的区别,所以以后定义一个索引不能再使用默 认的 mapping 了,要手工建立 mapping, 因为要选择分词器。

3)、自定义词库 

 这里采用nginx配合使用自定义分词器

安装 nginx

 随便启动一个 nginx 实例,只是为了复制出配置

 docker run -p 80:80 --name nginx -d nginx:1.10

 将容器内的配置文件拷贝到当前目录:docker container cp nginx:/etc/nginx .

别忘了后面的点

 修改文件名称:mv nginx conf 把这个 conf 移动到/mydata/nginx 下

 终止原容器:docker stop nginx

 执行命令删除原容器:docker rm $ContainerId

 创建新的 nginx;执行以下命令

docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10

 配置ik分词器配置

在nginx挂载的文件下的html中创建:

mkdir es
cd es
vi fenci.txt

保存退出

 修改/usr/share/elasticsearch/plugins/ik/config/中的 IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://192.168.128.130/fenci/myword.txt</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

 然后重启 es 服务器,重启 nginx。 在 kibana 中测试分词效果

 测试

POST _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" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "殿下",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 3
    }
  ]
}

 更新完成后,es 只会对新增的数据用新词分词。历史数据是不会重新分词的。如果想要历 史数据重新分词。需要执行:

POST my_index/_update_by_query?conflicts=proceed

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路由 OSPF简介、OSPF与其它路由的区别、OSPF区域概念、OSPF路由代名词IR、BR、ABR、ASBR概念简介。

4.2.0 路由 OSPF&#xff08;简介、OSPF与静态、OSPF区域概念、OSPF路由代名词&#xff09; 目录OSPF简介OSPF与其它路由的区别OSPF区域概念OSPF路由代名词概念OSPF简介 OSPF 开放式最短路径优先&#xff08;Open Shortest Path First&#xff09; OSPF动态路由协议属于内部网…

【C语言 数据结构】二叉树

文章目录二叉树一、二叉树的概念二、二叉树的基本形态三、二叉树的性质四、特殊的二叉树五、二叉树的存储结构5.1 顺序5.2 链表5.2.1 二叉链表5.2.1 三叉链表六、二叉树的遍历先序遍历&#xff08;T L R&#xff09;中序遍历&#xff08;L T R&#xff09;后序遍历&#xff08;…

#P05807. 等差数列

Description 小J学习了等差数列&#xff0c;于是他很开心的知道了 123.....1005050. 现在他想知道&#xff0c;对于某个公差为1的等差数列&#xff0c;如果总和为N的话。 有多少个等差数列满足这个条件 Format Input 一行给出整数N N<10^12 Output 一行给出你的结…

【学习】domain adaptation、BERT

文章目录一、domain adaptation领域适应domain shiftdomain adversarial training![在这里插入图片描述](https://img-blog.csdnimg.cn/26ef051b6a6148cbadb2dc6a9067fce2.png)domain generalization二、自监督学习多语言BERT的跨语言能力交叉学科能力用人工数据进行预训练一、…

JUC高并发-进程与线程

1.idea快捷键 shiftalt向上箭头 &#xff1a;表示把代码向上移动一行 ctrlaltL&#xff1a;整理代码的格式 ctrlshiftF10&#xff1a;启动程序 2.进程与线程 2.1 进程与线程 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就…

多变量微积分1

叉乘的定义&#xff1a; 混合积的几何意义&#xff1a;就是平行六面体的体积 三个向量共面的充要条件&#xff1a; 这里要注意&#xff0c;混合机对应的就是三阶行列式的值。 平面方程&#xff1a; 点法式&#xff1a; 一般式&#xff1a; 截距式&#xff1a; 三点式&#xff…

CMake中link_libraries的使用

CMake中的link_libraries命令用于将库链接到稍后添加的所有targets.其格式如下&#xff1a; link_libraries([item1 [item2 [...]]][[debug|optimized|general] <item>] ...) 指定在通过诸如add_executable或add_library等命令链接稍后在当前目录或更低(below)目录中创建…

RabbitMQ实现延迟队列

业务场景&#xff1a; 延迟发送短信用户下单&#xff0c;若15分钟内用户未支付&#xff0c;取消订单预约工作会议&#xff0c;20分钟后通知所有参会人员 … 实现方式1&#xff1a;死信交换机 死信概念&#xff1a;当一个队列中的消息满足下列情况之一&#xff0c;就会变成死…

数字验证学习笔记——SystemVerilog芯片验证19 ——线程的控制

一、线程的控制 1.1 fork并行线程语句块 fork join_any 当T3结束时&#xff0c;退出fork join_any 后&#xff0c;T1和T2还会执行。 1.1.1 fork … join 上述代码中&#xff0c;在fork join中开辟了4个子线程&#xff0c;当4个子线程执行完之后&#xff0c;才能执行下面的$di…

《垃圾回收算法手册 自动内存管理的艺术》——并发算法预备知识(笔记)

文章目录十二、特定语言相关内容12.1 终结12.1.1何时调用终结方法12.1.2 终结方法应由哪个线程调用12.1.3 是否允许终结方法彼此之间的并发12.1.4 是否允许终结方法访问不可达对象12.1.5 何时回收已终结对象12.1.6 终结方法执行出错时应当如何处理12.1.7 终结操作是否需要遵从某…

指针进阶之字符指针(超详细)

文章目录一、回顾二、字符指针1.基本用法2.误区&#xff08;1&#xff09;字符指针存放字符串首元素地址&#xff08;2&#xff09;输出问题3.内存布局三、字符指针与字符串数组1.字符指针2.字符串数组四、面试题1.One2.Two3.探究4.补充五、地址问题六、字符数组与字符串数组1.…

普通索引和唯一索引,应该怎么选择?

在前面的基础篇文章中&#xff0c;我给你介绍过索引的基本概念&#xff0c;相信你已经了解了唯一索引和普通索引的区别。今天我们就继续来谈谈&#xff0c;在不同的业务场景下&#xff0c;应该选择普通索引&#xff0c;还是唯一索引&#xff1f; 假设你在维护一个市民系统&…

基于springboot+mybatis+mysql+html实现在线教育平台系统

基于springbootmybatismysqlhtml实现在线教育平台系统1. 技术介绍2.功能介绍3. 前端3.1 首页3.2 课程3.3 登入3.4 商品兑换3.5 课程发布4. 后端4.1 登录4.2 系统管理4.3 课程管理4.4 教师管理4.5 导航菜单4.6 轮播管理4.7 通知管理4.8 礼品管理1. 技术介绍 核心技术&#xff1…

【电工技术】期末复习题

1.电路是为实现人们的某种需求&#xff0c;由 电源 、中间环节和负载三部分按一定方式组合起来&#xff0c;使电流流通的整体。 2&#xff0e;在使用叠加定理对电路进行分析时&#xff0c;通常要对电源作除源处理&#xff0c;处理方法是将各个理想电压源 短接 …

ArcGIS基础实验操作100例--实验33计算栅格统计参数

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验33 计算栅格统计参数 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

2022年终总结与展望

2022年终总结 自2019年3月13日入驻CSDN&#xff0c;已经三年零九个月了。截至2022年12月31日&#xff0c;CSDN博客已发原创博文112篇&#xff0c;粉丝3616个&#xff0c;访问量超过157万次。 2019年12月31日数据情况&#xff1a; 2020年12月31日数据情况&#xff1a; 2021年1…

7-9 包装机

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道&#xff0c;放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时&#xff0c;活塞向左推动&#xff0c;将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时&#xff0c;机械手将抓取筐顶部的一件物品&#x…

尚医通- Nacos服务注册 医院列表接口(二十一)

目录&#xff1a; &#xff08;1&#xff09;后台系统-医院管理-需求和Nacos启动 &#xff08;2&#xff09;医院列表-Nacos注册服务 &#xff08;3&#xff09;医院列表接口-初步实现 .&#xff08;1&#xff09;后台系统-医院管理-需求和Nacos启动 之前我们完成了数据相…

基于Java+Swing实现捕鱼达人游戏(含课程报告)

基于JavaSwing实现捕鱼达人游戏&#xff08;含课程报告&#xff09;一、系统介绍1、开发背景2、基本内容、实现方法及主要技术实现目标3实现目标二、功能展示三、其他系统一、系统介绍 1、开发背景 捕鱼达人这个项目是一个娱乐性的游戏开发&#xff0c;本次游戏的程序设计包含…

Spring6笔记4

十四、GoF之代理模式 14.1 对代理模式的理解 代理模式中有一个非常重要的特点&#xff1a;对于客户端程序来说&#xff0c;使用代理对象时就像在使用目标对象一样。【在程序中&#xff0c;目标需要被保护时】 业务场景&#xff1a;系统中有A、B、C三个模块&#xff0c;使用这…