elasticsearch 添加或修改分词器
1 索引的分析
索引分析: 就是把输入的文本块按照一定的策略进行分解, 并建立倒排索引的过程. 在Lucene的架构中, 这个过程由分析器(analyzer)完成.
1.1 分析器的组成
① 字符过滤器(character filter): 比如去除HTML标签、把&
替换为and
等.
② 分词器(tokenizer): 按照某种规律, 如根据空格、逗号等, 将文本块进行分解.
③ 标记过滤器(token filter): 所有被分词器分解的词都将经过token filters的处理, 它可以修改词(如小写化处理)、去掉词(根据某一规则去掉无意义的词, 如"a", "the", "的"等), 增加词(如同义词"jump"、"leap"等).
注意: 人们一般将分析器通称为分词器, 并不是相等的关系, 而是包含的关系.
1.2 倒排索引的核心原理-normalization
建立倒排索引时, 会执行normalization
(正常化)操作 —— 将拆分的各个单词进行处理, 以提高搜索时命中关联的文档的概率.
normalization的方式有: 时态转换, 单复数转换, 同义词转换, 大小写转换等.
比如文档中包含
His mom likes small dogs
:
① 在建立索引的时候normalization会对文档进行时态、单复数、同义词等方面的处理;
② 然后用户通过近似的mother liked little dog
, 也能搜索到相关的文档.
2.ES的默认分词器
(1) ES中的默认分词器: standard tokenizer, 是标准分词器, 它以单词为边界进行分词. 具有如下功能:
① standard token filter: 去掉无意义的标签, 如<>, &, - 等.
② lowercase token filter: 将所有字母转换为小写字母.
③ stop token filer(默认被禁用): 移除停用词, 比如"a"、"the"等.
(2) 测试默认分词器:
GET _analyze // ES引擎中已有standard分词器, 所以可以不指定index
{"analyzer": "standard", "text": "There-is & a DOG<br/> in house"
}
可以发现, Elasticsearch对text文本进行了分析处理, 结果如下:
{"tokens" : [{"token" : "there", // 分词"start_offset" : 0, // 起始偏移量"end_offset" : 5, // 结束偏移量"type" : "<ALPHANUM>", // 分词的类型"position" : 0 // 该分词在文本中的位置},{"token" : "is","start_offset" : 6,"end_offset" : 8,"type" : "<ALPHANUM>","position" : 1},{"token" : "a","start_offset" : 11,"end_offset" : 12,"type" : "<ALPHANUM>","position" : 2},// 省略其他4项]
}
3 修改分词器:
说明: 必须先关闭索引, 添加完成后, 再及时打开索引进行搜索等操作, 否则将出现错误.
// 关闭索引:
POST address/_close// 启用English停用词token filter
PUT address/_settings
{"analysis": {"analyzer": {"my_token_filter": { // 自定义的分词器名称"type": "standard","stopwords": "_english_"}}}
}// 打开索引:
POST address/_open
自定义以逗号隔开分词 index.可省略
PUT nn/_settings
{
"index.analysis": {"analyzer": {"comma": {"pattern": ",","type": "pattern"}}}
}
4 定制分词器
4.1 向索引中添加自定义的分词器
同样的, 在添加新的分词器之前, 必须先关闭索引, 添加完成后, 再打开索引进行搜索等操作.
PUT address/_settings
{"analysis": {"char_filter": {"&_to_and": {"type": "mapping","mappings": ["& => and"]}},"filter": {"my_stopwords": {"type": "stop","stopwords": ["the", "a"]}},"analyzer": {"my_analyzer": { // 自定义的分析器名称"type": "custom","char_filter": ["html_strip", "&_to_and"], // 跳过HTML标签, 将&符号转换为"and""tokenizer": "standard","filter": ["lowercase", "my_stopwords"] // 转换为小写}}}
}
4.2 测试自定义分析器
GET address/_analyze
{"analyzer": "my_analyzer", // 上面定义的分析器名称"text": "There-is & a DOG<br/> in house"
}
可以发现, 返回的分析结果中已经对大写单词、HTML标签, 以及"&"做了处理.
{"tokens" : [// there和is{"token" : "and", // &被处理成了and"start_offset" : 9,"end_offset" : 10,"type" : "<ALPHANUM>","position" : 2},// dog、in和house]
}
4.3 向映射中添加自定义的分词器
PUT address/_mapping/province
{"properties": {"content": {"type": "text","analyzer": "my_analyzer"}}
}
此时查看mapping信息:
GET address/_mapping
发现自定义的分析器已经配置到province上了:
{"address": {"mappings": {"province": {"properties": {"area" : {"type" : "float"},"content" : {"type" : "text","analyzer" : "my_analyzer"},"name" : {"type" : "text"}}}}}
}
5 常见问题
在修改索引之前, 没有关闭索引, 修改时发生如下错误:
{"error": {"root_cause": [{"type": "illegal_argument_exception","reason": "Can't update non dynamic settings [[index.analysis.analyzer.my_token_filter.type, index.analysis.analyzer.my_token_filter.stopwords]] for open indices [[address/Ci6MJV4sTyuoF4r9aLvVZg]]"}],"type": "illegal_argument_exception","reason": "Can't update non dynamic settings [[index.analysis.analyzer.my_token_filter.type, index.analysis.analyzer.my_token_filter.stopwords]] for open indices [[address/Ci6MJV4sTyuoF4r9aLvVZg]]"},"status": 400
}
elasticsearch 添加或修改分词器相关推荐
- 服务器安装配置elasticsearch,kibana,IK分词器和拼音分词器,集群搭建教程
docker安装配置elasticsearch,kibana和IK分词器 elasticsearch文章系列 前置安装docker 创建docker网络 安装Elasticsearch 运行elast ...
- 如何在Elasticsearch中安装中文分词器(IK+pinyin)
如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当 ...
- Solr4.3整合到Tomcat中并添加MMSeg4j中文分词器
2019独角兽企业重金招聘Python工程师标准>>> Solr4.3整合到Tomcat中并添加MMSeg4j中文分词器 1.新建一个文件夹命名为Solr并在里面建两个文件夹分别命名 ...
- Elasticsearch Analyzer 内置分词器
Elasticsearch Analyzer 内置分词器 篇主要介绍一下 Elasticsearch中 Analyzer 分词器的构成 和一些Es中内置的分词器 以及如何使用它们 前置知识 es 提供 ...
- Elasticsearch中安装IK分词器
Elasticsearch中默认的分词器对中文的支持不好,会分隔成一个一个的汉字.而IK分词器对中文的支持比较好一些,主要有两种模式"ik_smart"和"ik_max_ ...
- ElasticSearch用法和IK分词器
ElasticSearch用法和IK分词器 ElasticSearch 是什么? 为什么选择ES? ES提供的能力 ES常用使用场景 ES架构 ES 基本概念 ES 数据类型 ElasticSearc ...
- Elasticsearch:IK 中文分词器
Elasticsearch 内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如: POST /_analyze {"text": "我爱北京天安门&quo ...
- Postman查看Elasticsearch自带的分词器效果
Postman查看Elasticsearch自带的分词器效果 一.实验的前提是es服务器已经安装好并可以使用. 二.在postman上按照下图样式点击发送 查看结果 安装好ES之后,想看看ES自带的分 ...
- Elasticsearch 定义多个分词器模板
Elasticsearch 定义多个分词器模板 版本:Elasticsearch 7.2.0 1.定义索引时,使用多个分词器 2.在模板中定义中使用多个分词器 3.ik+pinyin 对人工智能感 ...
最新文章
- oracle解锁system密码,Oracle System密码忘记 密码修改、删除账号锁定lock
- android 自定义圆形图片素材,Android 使用shape制作drawable素材
- windows IIS权限经典设置教程
- VTK修炼之道47:图形基本操作进阶_法向量计算
- 【CSS 技能提升】 :before和:after的使用
- The Best Way to Unit Test in Android
- .net core image怎么保存_C# 将PDF转为多种Image图像文件格式(Png/Bmp/Emf/Tiff)
- ruby 将日期转化为时间_Ruby中的日期和时间类
- 【面向对象】面向对象程序设计测试题4-Java中的类和对象测试
- android studio gradle home,Android Studio3.0 Gradle 4.1配置
- 网络:Server returned HTTP response code: 400(url中文)
- Sublime Text3之安裝Emmet及使用技巧
- 详解Unity中的生命周期函数
- 海洋cms模板免费下载
- 【NEON 和 VFP 编程】VFP 指令
- Java 如何将线程挂起呢?
- wincc与SQL Server数据库通讯的方法介绍
- 长安链Batch交易池生产可用重构方案设计及其成效
- 高频电容 低频电容
- VS2016 发布项目提示 CS0006 C# Metadata file 'xxxxxxx.dll' could not be found
热门文章
- 一金创投月薪几万怎样出资理财 月薪几万怎样出资保值
- 导出excel:下载模板时填充数据方法实现
- php空间xpyun_php云人才系统官方版-phpyun下载 v4.0 官方正式版 - 安下载
- 计算机休眠是打不开,电脑休眠打不开怎么办,浅析win7系统电脑休眠打不开的解决方法...
- 找出数组对象(json数组)中重复的项
- 浙江大学计算机学院 鲍,研代会|浙江大学计算机学院第二十次研究生代表大会成功召开...
- WDA-BOPF业务对象处理框架
- 如何才能有论文创新点?idear
- 面向初学者的3D游戏着色器————屏幕空间环境遮挡(SSAO)
- mmkv以及sp的使用以及比较