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 添加或修改分词器相关推荐

  1. 服务器安装配置elasticsearch,kibana,IK分词器和拼音分词器,集群搭建教程

    docker安装配置elasticsearch,kibana和IK分词器 elasticsearch文章系列 前置安装docker 创建docker网络 安装Elasticsearch 运行elast ...

  2. 如何在Elasticsearch中安装中文分词器(IK+pinyin)

    如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当 ...

  3. Solr4.3整合到Tomcat中并添加MMSeg4j中文分词器

    2019独角兽企业重金招聘Python工程师标准>>> Solr4.3整合到Tomcat中并添加MMSeg4j中文分词器 1.新建一个文件夹命名为Solr并在里面建两个文件夹分别命名 ...

  4. Elasticsearch Analyzer 内置分词器

    Elasticsearch Analyzer 内置分词器 篇主要介绍一下 Elasticsearch中 Analyzer 分词器的构成 和一些Es中内置的分词器 以及如何使用它们 前置知识 es 提供 ...

  5. Elasticsearch中安装IK分词器

    Elasticsearch中默认的分词器对中文的支持不好,会分隔成一个一个的汉字.而IK分词器对中文的支持比较好一些,主要有两种模式"ik_smart"和"ik_max_ ...

  6. ElasticSearch用法和IK分词器

    ElasticSearch用法和IK分词器 ElasticSearch 是什么? 为什么选择ES? ES提供的能力 ES常用使用场景 ES架构 ES 基本概念 ES 数据类型 ElasticSearc ...

  7. Elasticsearch:IK 中文分词器

    Elasticsearch 内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如: POST /_analyze {"text": "我爱北京天安门&quo ...

  8. Postman查看Elasticsearch自带的分词器效果

    Postman查看Elasticsearch自带的分词器效果 一.实验的前提是es服务器已经安装好并可以使用. 二.在postman上按照下图样式点击发送 查看结果 安装好ES之后,想看看ES自带的分 ...

  9. Elasticsearch 定义多个分词器模板

    Elasticsearch  定义多个分词器模板 版本:Elasticsearch  7.2.0 1.定义索引时,使用多个分词器 2.在模板中定义中使用多个分词器 3.ik+pinyin 对人工智能感 ...

最新文章

  1. oracle解锁system密码,Oracle System密码忘记 密码修改、删除账号锁定lock
  2. android 自定义圆形图片素材,Android 使用shape制作drawable素材
  3. windows IIS权限经典设置教程
  4. VTK修炼之道47:图形基本操作进阶_法向量计算
  5. 【CSS 技能提升】 :before和:after的使用
  6. The Best Way to Unit Test in Android
  7. .net core image怎么保存_C# 将PDF转为多种Image图像文件格式(Png/Bmp/Emf/Tiff)
  8. ruby 将日期转化为时间_Ruby中的日期和时间类
  9. 【面向对象】面向对象程序设计测试题4-Java中的类和对象测试
  10. android studio gradle home,Android Studio3.0 Gradle 4.1配置
  11. 网络:Server returned HTTP response code: 400(url中文)
  12. Sublime Text3之安裝Emmet及使用技巧
  13. 详解Unity中的生命周期函数
  14. 海洋cms模板免费下载
  15. 【NEON 和 VFP 编程】VFP 指令
  16. Java 如何将线程挂起呢?
  17. wincc与SQL Server数据库通讯的方法介绍
  18. 长安链Batch交易池生产可用重构方案设计及其成效
  19. 高频电容 低频电容
  20. VS2016 发布项目提示 CS0006 C# Metadata file 'xxxxxxx.dll' could not be found

热门文章

  1. 一金创投月薪几万怎样出资理财 月薪几万怎样出资保值
  2. 导出excel:下载模板时填充数据方法实现
  3. php空间xpyun_php云人才系统官方版-phpyun下载 v4.0 官方正式版 - 安下载
  4. 计算机休眠是打不开,电脑休眠打不开怎么办,浅析win7系统电脑休眠打不开的解决方法...
  5. 找出数组对象(json数组)中重复的项
  6. 浙江大学计算机学院 鲍,研代会|浙江大学计算机学院第二十次研究生代表大会成功召开...
  7. WDA-BOPF业务对象处理框架
  8. 如何才能有论文创新点?idear
  9. 面向初学者的3D游戏着色器————屏幕空间环境遮挡(SSAO)
  10. mmkv以及sp的使用以及比较