ElasticSearch 学习8 :ik分词器的扩展,及java调用ik分词器的analyzer

news2024/11/27 14:50:25

1.前言:

上篇已经说过ik的集成,这篇说下ik的实际使用

2.2、IK分词器测试

IK提供了两个分词算法ik_smart 和 ik_max_word

  • ik_smart:为最少切分
  • ik_max_word:为最细粒度划分。
2.2.1、最小切分示例
 
  1. #分词器测试ik_smart

  2. 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
		}
	]
}
 
2.2.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
		}
	]
}

3、IK分词器为何如此智能

        通过上面的示例我们也看到了,这种中文的分词效果是ES内置的分词器无法比拟的。那么它是如何做到的呢?不要过于惊讶,因为原理其实非常简单,它是通过索引字典来达到的,这样说可能比较抽象难懂,我们来实际看看ES的plugins/ik/config目录:

3.1、ik分词器的字典

        看到那些*.dic结尾的文件了吗?其实它就是dictionary(字典)的简写,来实际看看字典内容:如上图。

        实际的词汇量是非常巨大的,根本不可能完全收录到字典中。如果有需要,我们完全可以通过在字典文件中增加我们想要的词语来扩展我们自己的分词规则。

4、扩展ik分词器的字典

示例:

        “麻花疼”使用ik_smart、ik_max_word 分词后的结果都是:麻花、疼。

   无法分词为一个完整的“麻花疼”,因为ik分词器的词典中没有这个词。示例如下图:

 麻花疼

使用ik_smart分词GET _analyze{"analyzer": "ik_smart", "text": "麻花疼"}

{
	"tokens": [
		
		{
			"token": "麻花",
			"start_offset": 0,
			"end_offset": 2,
			"type": "CN_WORD",
			"position": 1
		},
		{
			"token": "疼",
			"start_offset": 2,
			"end_offset": 3,
			"type": "CN_CHAR",
			"position": 2
		}
	]
}

如何将“麻花疼”分词为一个完整的词,需要将其添加到词典中。

4.1、ik分词器的配置文件目录

 在plugins/elasticsearch-analysis-ik-6.8.2/config/config目录下有ik分词配置文件:

  • IKAnalyzer.cfg.xml用来配置自定义的词库
  • main.dic,ik原生内置的中文词库,只要是这些单词,都会被分在一起。
  • surname.dic,中国的姓氏。
  • suffix.dic,特殊(后缀)名词,例如乡、江、所、省等等。
  • preposition.dic,中文介词,例如不、也、了、仍等等。
  • stopword.dic,英文停用词库,例如a、an、and、the等。
  • quantifier.dic,单位名词,如厘米、件、倍、像素等。
  • extra开头的文件,是额外的词库。

4.2、IKAnalyzer.cfg.xml配置文件

4.3、新增字典配置文件,后缀为dic 

在新的字段配置文件my_ik.dic中添加新词:“麻花疼”。

注意:词库的编码必须是utf-8

 4.4、将新增的配置文件添加到IK字典配置文件中,并重启ES和KIBANA

 ES启动控制台中会显示已经读取到自定义字典:

再次查询,该词已经成功识别 。

4.5、IK插件还支持热更新:

IKAnalyzer.cfg.xml配置文件中的有如下配置:

 其中 words_location 是指一个 url,比如 http://yoursite.com/getCustomDict,该请求只需满足以下两点即可完成分词热更新。

  1. 该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
  2. 该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。

满足上面两点要求就可以实现热更新分词了,不需要重启es 。

        可以将需自动更新的热词放在一个 UTF-8 编码的 .txt文件里,放在 nginx 或其他简易 http server 下,当 .txt文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt文件。

5.java调用ik分词器的analyzer:

这里是用httpClient实现的,没用es的客户端,网上找了半天也没找到合适的文章,自己用httpClient写吧

  public static String httpPostNeedPassword(String json,String url,String username,
            String password) {
        String result = "";
        try {
            HttpClient httpClient = new HttpClient();
            PostMethod postMethod = new PostMethod(url);
            //需要验证
            UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username, password);
            httpClient.getState().setCredentials(AuthScope.ANY, creds);
            StringRequestEntity requestEntity = new StringRequestEntity(json, "application/json", "UTF-8");
            postMethod.setRequestEntity(requestEntity);
            int i = httpClient.executeMethod(postMethod);
            InputStream inputStream = postMethod.getResponseBodyAsStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            String s;
            StringBuffer sb = new StringBuffer();
            while ((s = br.readLine()) != null) {
                sb.append(s + "\n");
            }
            result = new String(sb.toString().getBytes(),"UTF-8");
            postMethod.releaseConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    @Test
    public void test(){
        String s = httpPostNeedPassword("{ \"analyzer\": \"ik_max_word\", \"text\":\"洛阳古迹风景很好,是旅游胜地,毛泽东也去过,发呆着\" }", "http://123.57.220.31:9200/_analyze", "elastic", "mycomm123");
        System.out.println(s);
    }

结果:

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

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

相关文章

互联网项目有哪些值得做的

互联网已经融入了我们生活的方方面面,从电商巨头到科技创新,互联网带来的变革和便利无处不在。而在这个信息广泛的时代,越来越多的人开始思考如何利用互联网去创造价值。现如今,互联网项目的形式多种多样,有些让我们的…

剑指offer——JZ79 判断是不是平衡二叉树 解题思路与具体代码【C++】

一、题目描述与要求 判断是不是平衡二叉树_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。 在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树 平衡二叉树(…

【Java 进阶篇】深入了解HTML表单标签

HTML(Hypertext Markup Language)表单标签是网页开发中的重要组成部分,用于创建各种交互式元素,允许用户输入、提交和处理数据。本文将深入探讨HTML表单标签,包括如何创建表单、各种输入元素、表单属性以及一些最佳实践…

C++学习day2

作业: 1> 思维导图 2>自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height), 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和…

jenkins工具系列 —— 插件 使用Changelog获取commit记录

文章目录 安装changelog插件重启jenkins配置 ChangelogExecute shell 使用 changelog邮件中html格式也可以使用构建测试(查看构建项 -> 控制台输出) 安装changelog插件 插件文件可通过 V 获取 点击 左侧的 Manage Jenkins —> Plugins ——> …

Docker安装——Ubuntu (Jammy 22.04)

一、为什么要用 Ubuntu?(centos和ubuntu有什么区别) 使用lsb_release命令:lsb_release -a ,即可查看ubantu的版本,但是为什么要使用ubantu 呢? 区别:1、centos基于EHEL开发,而ubunt…

2023年10月8日

三盏灯流水 .text .global _start _start: 1.设置GPIOE寄存器的时钟使能 RCC_MP_AHB4ENSETR[5:4]->1 0x50000a28 LDR R0,0X50000A28 LDR R1,[R0] 从r0为起始地址的4字节数据取出放在R1 ORR R1,R1,#(0x3<<4) 第4位设置为1 STR R1,[R0] 写回2.设置PE10管脚为…

SketchyCOCO数据集进行前景图像、背景图像和全景图像的分类

SketchyCOCO数据集进行前景图像、背景图像和全景图像的分类 import os import shutildef CopyFile(src, dst, filename):if not os.path.exists(dst):os.makedirs(dst)print(create dir: dst)try:shutil.copy(src\\filename, dst\\filename)except Exception as e:print(cop…

经典算法-----农夫过河问题(深度优先搜索)

目录 前言 农夫过河问题 1.问题描述 2.解决思路 位置编码 获取位置 判断是否安全 深度优先遍历&#xff08;核心算法&#xff09; 3.完整代码 前言 今天我们来解决一个有意思的问题&#xff0c;也就是农夫过河问题&#xff0c;可能这个问题我们小时候上学就听说过类似的…

分布式缓存-Redis集群

单点Redis的问题 数据丢失问题 Redis是内存存储&#xff0c;服务重启可能会丢失数据 并发能力问题 单节点Redis并发能力虽然不错&#xff0c;但也无法满足如618这样的高并发场景 故障恢复问题 如果Redis宕机&#xff0c;则服务不可用&#xff0c;需要一种自动的故障恢复手段…

机器学习|深度学习|重磅推出---全网最全Numpy简明教程(一)

本教程面向初学者的Numpy简明教程&#xff0c;学好Numpy才能在深度学习、机器学习、AI等领域进军&#xff0c;如果感觉此文不错&#xff0c;欢迎和博主交流探讨 文章目录 1、Numpy介绍2、创建ndarray数组2.1、np.array2.2、np.ones2.3、np.zeros2.4、np.full2.5、np.eye2.6、np…

ChatGPT私有数据结合有什么效果?它难吗?

ChatGPT的出现可谓是惊艳了全世界&#xff0c;ChatGPT的问答能力通过了图灵测试&#xff0c;使其回答问题的方式与人类几乎无法区分。大家不甘于只在官方的对话页面问答&#xff0c;想利用 GPT 模型的自然语言能力结合私有数据开拓更多的应用场景。 | ChatGPT私有数据结合特点 …

ARM:使用汇编完成三个灯流水亮灭

1.汇编源代码 .text .global _start _start: 设置GPIOF寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0x1<<5)STR R1,[R0]设置GPIOE寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0] 从r0为起始地址的4字节数据取出放在R1ORR R1,R1,#(0x1<<4) 第4位设…

day24-JS进阶(构造函数,new实例化,原型对象,对象原型,原型继承,原型链)

目录 构造函数 深入对象 创建对象三种方式 构造函数 new实例化执行过程(important!) 实例成员&静态成员 实例对象&实例成员 静态成员 内置构造函数 基本包装类型 Object Object.keys(obj)返回所有键组成的字符串数组 Object.values(obj)返回所有值组成的字…

C# 替换字符串最后一个逗号为分号

使用场景&#xff0c;sql语句的insert into table(c1,c2,c3) values (v1,v2,v3),(v1,v2,v3),(v1,v2,v3), 为了提高执行效率&#xff0c;在一个insert into中执行时&#xff0c;在循环中拼接语句&#xff0c;最后一个逗号需要替换为分号才能执行。 public static string Replace…

采集软件在市场营销中的应用价值

随着互联网的发展&#xff0c;市场竞争愈发激烈&#xff0c;如何获取准确、全面的市场信息成为企业成功的关键。数据利器作为一款强大的市场营销助手软件&#xff0c;具备多项功能&#xff0c;帮助您实现精准营销&#xff0c;发现商机。 软件功能&#xff1a; 搜索引擎采集&…

docker:修改容器的共享内存大小

错误提示&#xff1a; RuntimeError: DataLoader worker (pid 83709) is killed by signal: Bus error. It is possible that dataloader’s workers are out of shared memory. Please try to raise your shared memory limit. 解决办法&#xff1a; 1&#xff1a;创建新容器…

docker虚拟网桥和业务网段冲突处理

ifconfig查看docker虚拟网桥ip地址 docker inspect --format{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} $(docker ps -aq)查询所有容器的ip 修改docker-compose networks networks xxx-network: driver: bridge ipam: c…

web应用常见的其他漏洞总结

1.暴力破解用户名和密码 admin:admin, test:test, weblogic:weblogic, root:passwd 2. 扫敏感目录及备份文件 以ation 为扩展名的文件&#xff0c;通过7kb和k8&#xff0c;破壳扫描&#xff0c;扫描出来一个Web.rar文件&#xff0c;可获取MSSQL SSA连接用户名密码,通过测试…

2.6 宽带接入技术

思维导图&#xff1a; 前言&#xff1a; 我的理解&#xff1a; 1. **早期互联网接入技术的局限性**&#xff1a; - 作者首先回顾了早期用户通过电话线和调制解调器连接到互联网服务提供商&#xff08;ISP&#xff09;的方式&#xff0c;指出这种方式的速度上限是56 kbit/…