本章内容概述
1、中文分词器IK插件介绍
2、Linux环境安装中文分词器IK插件
3、自定义扩展分词器文件
4、elasticsearch文档映射概述
1、中文分词器IK插件介绍
1.1 分词器简介
在对文档(Document)中的内容进行索引前, 需要对文档的内容使用分析对象(分词器)进行分词.
分词器:从一串文本中切分出来一个个的词条,并对每个词条进行标准化。
包含三部分:
character filter: 分词之前的预处理,过滤掉HTML标签,特殊符号转换等;
tokenizer: 分词
token filter: 标准化,比如大小写转换,同义词转换等
分词的目的是为了索引, 索引的目的是为了搜索.
分词的过程是 先分词, 再过滤:
分词: 将Document中Field域的值切分成一个一个的单词. 具体的切分方法(算法)由具体使用的分词器内部实现.
过滤: 去除标点符号,去除停用词(的、是、is、the、a等), 词的大写转为小写.
分词流程图:
停用词说明:
停用词是指为了节省存储空间和提高搜索效率, 搜索引擎在索引内容或处理搜索请求时会自动忽略的字词, 这些字或词被称为"stop
words". 如语气助词、副词、介词、连接词等, 通常自身没有明确的含义,只有放在一个上下文语句中才有意义(如:的、在、啊, is、a等).
例如:
原始文档内容: Lucene is a Java full-text search engine
分析以后的词: lucene java full text search engine
1.2 ES分词器介绍
因为Elasticsearch中默认的标准分词器分词器对中文分词不是很友好,会将中文词语拆分成一个一个中文的汉子。因此引入中文分词器
-es-ik插件。
es内置种分词器,他们分别是、standard analyzer、simple analyzer、whitespace analyzer、language analyzer。所以如果
是中文还要程序员自动手动安装中文分词器。
假设有如下一段话:
Set the shape to semi-transparent by calling set_trans(5)
standard analyzer:(默认的)他会将词汇单元转换为小写形式,并去除停用词标点符号,支持中文采用的方法是单字切分。
结果是 set, the, shape, to, semi, transparent, by, calling, set_trans, 5(默认的是standard)
simple analyzer:首先会通过非字母字符来分割文本信息,然后将词汇单元统一为小写形式,该分析器会出掉数字类型的字符。
结果是 set, the, shape, to, semi, transparent, by, calling, set, trans
whitespace analyzer:仅仅是去除空格,对字符没有lowcase化,不支持中文;并且不对生成的词汇单元进行任何标准化处理。
结果是 Set, the, shape, to, semi-transparent, by, calling, set_trans(5)
language analyzer:特定的语言的分词器,不支持中文
1.3 演示ES传统分词器
通过Postman访问如下地址:http://192.168.34.64:9200/_analyze
分词结果:
{
"tokens": [
{
"token": "奥",
"start_offset": 0,
"end_offset": 1,
"type": "<IDEOGRAPHIC>",
"position": 0
},
{
"token": "迪",
"start_offset": 1,
"end_offset": 2,
"type": "<IDEOGRAPHIC>",
"position": 1
},
{
"token": "a4l",
"start_offset": 2,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 2
}
]
}
1.4 IK分词器介绍
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。
从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法
分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认
优化实现。
采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。
采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中
文词汇(姓名、地名处理)等分词处理。
对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用。
支持用户词典扩展定义。
针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索
的命中率。
2、Linux环境安装中文分词器IK插件
2.1 下载及安装
下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
注意: es-ik分词插件版本一定要和es安装的版本对应
第一步:下载es的IK插件[比如:elasticsearch-analysis-ik-6.4.3.zip]命名改为ik,然后解压
第二步: 上传到/usr/local/elasticsearch-6.4.3/plugins
第三步: 重启elasticsearch即可
2.2 演示IK分词器
分词结果:
{
"tokens": [
{
"token": "奥迪",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "a4l",
"start_offset": 2,
"end_offset": 5,
"type": "LETTER",
"position": 1
}
]
}
注:IK分词器默认有一些热词,但是不包含所有,我们可以自定义分词器文件
3、自定义扩展分词器文件
1、在/usr/local/elasticsearch-6.4.3/plugins/ik/config目录下创建custom文件夹
mkdir custom
2、进入custom目录,然后创建new_word.dic文件
touch new_word.dic
3、编辑new_word.dic文件,然后加入新的热词
vim new_word.dic
盘它
硬核
老表
王者荣耀
洪荒之力
马云
一带一路
4、配置文件引入新的自定义热词文件
vi IKAnalyzer.cfg.xml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uuur9CuJ-1619165360388)(images/77_引入自定义热词.png)]
5、重启elasticsearch
先杀进程,再重启
4、elasticsearch文档映射概述
已经把ElasticSearch的核心概念和关系数据库做了一个对比,索引(index)相当于数据库,类型(type)相当于数据表,映射
(Mapping)相当于数据表的表结构。ElasticSearch中的映射(Mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分
词器及属性等等。
文档映射就是给文档中的字段指定字段类型、分词器。
使用Kibana 运行GET /newcapecedu/user/_mapping
运行结果:
{
"newcapecedu": {
"mappings": {
"user": {
"properties": {
"age": {
"type": "long"
},
"car": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"sex": {
"type": "long"
}
}
}
}
}
}
由此得出结论,ElasticSearch的默认数据类型:数值类型都是long,字符串类型都是text
4.1 文档映射分类
动态映射:
我们知道,在关系数据库中,需要事先创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据表中插入数据。而
ElasticSearch中不需要事先定义映射(Mapping),文档写入ElasticSearch时,会根据文档字段自动识别类型,这种机制称之为动态映
射。
静态映射:
在ElasticSearch中也可以事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。