分析过程:
| 字符过滤器 | 首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and。 |
|
|---|---|---|
| 分词器 | 其次,字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。 | |
| Token 过滤器 | 最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 a, and, the 等无用词),或者增加词条(例如,像 jump 和 leap 这种同义词)。 |
字符过滤器
字符过滤类型有以下三种:
1.HTML字符过滤器
删除文本中的HTML元素,并且将HTML实体替换成对应的解码值(例如用&替换&amp;)。<br />参数配置:
| 参数名称 | 说明 |
|---|---|
escaped_tags |
在原始文本中要保留的一系列html标签 |
2.映射字符过滤器
映射字符过滤器接受键和值的map。每当遇到与key相同的字符串时,它将用与该key对应的value替换它们:
- 匹配是贪婪的;会优先匹配最长键进行匹配和替换。
- 允许替换为空字符串。
参数配置:
| 参数名称 | 参数说明 |
|---|---|
mappings |
一组映射,每个元素的格式为key => value。 |
mappings_path |
一个相对或者绝对的文件路径,指向一个每行包含一个 key =>value 映射的UTF-8编码文本映射文件。 |
以上两个参数必须提供一个。
PUT mapping_char_filter_example_index{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "keyword","char_filter": ["my_char_filter"]}},"char_filter": {"my_char_filter": {"type": "mapping","mappings": ["٠ => 0","١ => 1","٢ => 2","٣ => 3","٤ => 4","٥ => 5","٦ => 6","٧ => 7","٨ => 8","٩ => 9"],"mappings_path": "/app/resources/mappings.txt"}}}}}
过滤结果:[ My license plate is 25015 ]
POST mapping_char_filter_example_index/_analyze{"analyzer": "my_analyzer","text": "My license plate is ٢٥٠١٥"}
3.模式替换字符过滤器
使用正则表达式来匹配应替换为指定替换字符串的字符。替换字符串可以引用正则表达式中的捕获组。
配置参数**
| 参数名称 | 参数说明 |
|---|---|
pattern |
一个Java正则表达式. 必填 |
replacement |
替换字符串,可以使用$ 1 .. $ 9语法来引用捕获组,可以参考这里。 |
flags |
Java正则表达式标志。 标志应该用“|”进行分割,例如“CASE_INSENSITIVE | COMMENTS”。 |
PUT pattern_char_filter_example{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "standard","char_filter": ["my_char_filter"]}},"char_filter": {"my_char_filter": {"type": "pattern_replace","pattern": "(\\d+)-(?=\\d)","replacement": "$1_"}}}}}
过滤结果:[ My, credit, card, is, 123_456_789 ]
POST pattern_char_filter_example/_analyze{"analyzer": "my_analyzer","text": "My credit card is 123-456-789"}
一、内置分析器
| Standard Analyzer 标准分析器 |
(1)默认分词器,如果未指定,则使用该分词器。 (2)按词切分,支持多语言 (3)小写处理,它删除大多数标点符号、小写术语,并支持删除停止词。 |
|---|---|
| Simple Analyzer 简单分析器 |
(1)按照非字母切分,简单分词器在遇到不是字母的字符时将文本分解为术语 |
(2)小写处理,所有条款都是小写的。 |
| Whitespace Analyzer
空格分析器
| 空白字符作为分隔符,当遇到任何空白字符,空白分词器将文本分成术语。 |
| Stop Analyzer
无用词分析器 | (1)类似于Simple
Analyzer,但相比Simple Analyzer,支持删除无用词
(2)无用词指语气助词等修饰性词语,如the, an, is的, 这等 |
| Pattern Analyzer |
模式分词器使用正则表达式将文本拆分为术语。
(1)通过正则表达式自定义分隔符
(2)默认是\W+,即非字词的符号作为分隔符 |
| Language Analyzers
语言分析器 |
ElasticSearch提供许多语言特定的分析工具,如英语或法语。 |
| Fingerprint Analyzer |
指纹分词器是一种专业的指纹分词器,它可以创建一个指纹,用于重复检测。 |
| Custom analyzers
自定义分词器** | 如果您找不到适合您需要的分词器,您可以创建一个自定义分词器,它结合了适当的字符过滤器、记号赋予器和记号过滤器。 |
二、中文分析器 ik-analyzer
1.内置分析器对中文支持不友好
Elasticsearch 内置的分词器对中文不友好,会把中文分成单个字来进行全文检索,不能达到想要的结果,比如使用内置standard分析器对中文进行分词:
GET _analyze{"analyzer": "standard","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},{"token" : "最","start_offset" : 5,"end_offset" : 6,"type" : "<IDEOGRAPHIC>","position" : 5},{"token" : "大","start_offset" : 6,"end_offset" : 7,"type" : "<IDEOGRAPHIC>","position" : 6},{"token" : "的","start_offset" : 7,"end_offset" : 8,"type" : "<IDEOGRAPHIC>","position" : 7},{"token" : "笔","start_offset" : 8,"end_offset" : 9,"type" : "<IDEOGRAPHIC>","position" : 8},{"token" : "记","start_offset" : 9,"end_offset" : 10,"type" : "<IDEOGRAPHIC>","position" : 9},{"token" : "本","start_offset" : 10,"end_offset" : 11,"type" : "<IDEOGRAPHIC>","position" : 10},{"token" : "厂","start_offset" : 11,"end_offset" : 12,"type" : "<IDEOGRAPHIC>","position" : 11},{"token" : "商","start_offset" : 12,"end_offset" : 13,"type" : "<IDEOGRAPHIC>","position" : 12}]}
2. 中文分析器 ik-analyzer
2.1 介绍
- 是一个开源的,基于java语言开发的轻量级的中文分词工具包。
- 支持细粒度和最大词长两种切分模式;
- 具有83万字/秒(1600KB/S)的高速处理能力
- 支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符
-
2.2 两种分词器
ik_max_word:最细粒度的拆分;尽可能多的拆分出词语
- ik_smart: 最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有
2.3 最细粒度分词器
分词结果:联想、是、全球、最大、的、笔记本、笔记、本厂、厂商GET _analyze{"analyzer": "ik_max_word","text":"联想是全球最大的笔记本厂商"}
token 是实际存储到索引中的词条。 position 指明词条在原始文本中出现的位置。 start_offset 和 end_offset 指明字符在原始字符串中的位置。
{"tokens" : [{"token" : "联想","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "是","start_offset" : 2,"end_offset" : 3,"type" : "CN_CHAR","position" : 1},{"token" : "全球","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 2},{"token" : "最大","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 3},{"token" : "的","start_offset" : 7,"end_offset" : 8,"type" : "CN_CHAR","position" : 4},{"token" : "笔记本","start_offset" : 8,"end_offset" : 11,"type" : "CN_WORD","position" : 5},{"token" : "笔记","start_offset" : 8,"end_offset" : 10,"type" : "CN_WORD","position" : 6},{"token" : "本厂","start_offset" : 10,"end_offset" : 12,"type" : "CN_WORD","position" : 7},{"token" : "厂商","start_offset" : 11,"end_offset" : 13,"type" : "CN_WORD","position" : 8}]}
2.4 最粗粒度分词器
GET _analyze{"analyzer": "ik_smart","text":"联想是全球最大的笔记本厂商"}
分词结果:联想、是、全球、最大、的、笔记本、厂商
{"tokens" : [{"token" : "联想","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "是","start_offset" : 2,"end_offset" : 3,"type" : "CN_CHAR","position" : 1},{"token" : "全球","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 2},{"token" : "最大","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 3},{"token" : "的","start_offset" : 7,"end_offset" : 8,"type" : "CN_CHAR","position" : 4},{"token" : "笔记本","start_offset" : 8,"end_offset" : 11,"type" : "CN_WORD","position" : 5},{"token" : "厂商","start_offset" : 11,"end_offset" : 13,"type" : "CN_WORD","position" : 6}]}
三、拼音分词器 pinyin-analyzer
1. 安装教程
es安装pinyin-analyzer教程
只需要将以下zip文件解压,将解压文件夹下面三个文件,拷贝到${es安装目录}/plugin/pinyin文件夹下面,后重启es即可完成安装:elasticsearch-analysis-pinyin-7.4.0.zip
2.使用用法
https://github.com/medcl/elasticsearch-analysis-pinyin/tree/6.x
四、为索引字段配置分析器
PUT /analyzer-test{"settings": {"analysis": {"analyzer": {"ik":{"tokenizer" : "ik_max_word"}}}},"mappings": {"article":{"dynamic":true,"properties":{"subject":{"type":"text","analyzer":"ik_max_word"}}}}}
增加数据
POST /analyzer-test/article/_bulk{ "index" : { "_id" : "1" } }{"subject" : ""闺蜜"崔顺实被韩检方传唤 韩总统府促彻查真相" }{ "index" : { "_id" : "2" } }{"subject" : "韩举行"护国训练" 青瓦台:决不许国家安全出问题" }{ "index" : { "_id" : "3" } }{"subject" : "媒体称FBI已经取得搜查令 检视希拉里电邮" }{ "index" : { "_id" : "4" } }{"subject" : "村上春树获安徒生奖 演讲中谈及欧洲排外问题" }{ "index" : { "_id" : "5" } }{"subject" : "希拉里团队炮轰FBI 参院民主党领袖批其“违法”" }
查询语法及查询结果
POST /analyzer-test/article/_search{"query" : { "match" : { "subject" : "希拉里和韩国" }},"highlight" : {"pre_tags" : ["<font color='red'>"],"post_tags" : ["</font>"],"fields" : {"subject" : {}}}}
{"took" : 62,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 2,"max_score" : 0.2876821,"hits" : [{"_index" : "analyzer-test","_type" : "article","_id" : "5","_score" : 0.2876821,"_source" : {"subject" : "希拉里团队炮轰FBI 参院民主党领袖批其“违法”"},"highlight" : {"subject" : ["<font color='red'>希拉里</font>团队炮轰FBI 参院民主党领袖批其“违法”"]}},{"_index" : "analyzer-test","_type" : "article","_id" : "3","_score" : 0.2876821,"_source" : {"subject" : "媒体称FBI已经取得搜查令 检视希拉里电邮"},"highlight" : {"subject" : ["媒体称FBI已经取得搜查令 检视<font color='red'>希拉里</font>电邮"]}}]}}
五、创建自定义分析器(简单)
一个自定义分析器的配置参数:
| tokenizer | 内置或自定义的标记器。(必需) | |
|---|---|---|
| char_filter | 内置或自定义 字符过滤器的数组。(可选) | |
| filter | 内置或自定义Token 过滤器的数组。(可选) | |
| position_increment_gap | 为文本值数组编制索引时,Elasticsearch会在一个值的最后一个项和下一个值的第一个项之间插入一个“间隙”(数组元素之间插入间隙),以确保短语查询与来自不同数组元素的两个项不匹配。默认为100 |
1.创建自定义分析器
PUT my_index{"settings": {"analysis": {"analyzer": {"my_custom_analyzer": {"type": "custom","tokenizer": "standard","char_filter": ["html_strip"],"filter": ["lowercase","asciifolding"]}}}}}
2.应用自定义分析器验证
POST my_index/_analyze{"analyzer": "my_custom_analyzer","text": "Is this <b>déjà vu</b>?"}
3.验证结果
验证结果:[ is, this, deja, vu ]
{"tokens" : [{"token" : "is","start_offset" : 0,"end_offset" : 2,"type" : "<ALPHANUM>","position" : 0},{"token" : "this","start_offset" : 3,"end_offset" : 7,"type" : "<ALPHANUM>","position" : 1},{"token" : "deja","start_offset" : 11,"end_offset" : 15,"type" : "<ALPHANUM>","position" : 2},{"token" : "vu","start_offset" : 16,"end_offset" : 22,"type" : "<ALPHANUM>","position" : 3}]}
六、创建自定义分析器(复杂)
1.创建自定义分析器
- 字符串过滤器配置:将:)替换为“happy”和:(替换为“sad”
- 分词器配置:模式标记器,配置为在标点字符上拆分
- Token过滤器配置:1.小写token过滤器 2.无用(停用)词过滤,配置为使用预定义的英文停止词列表
PUT compact_analyzer{"settings": {"analysis": {"analyzer": {"my_custom_analyzer": {"type": "custom","char_filter": ["emoticons"],"tokenizer": "punctuation","filter": ["lowercase","english_stop"]}},"tokenizer": {"punctuation": {"type": "pattern","pattern": "[ .,!?]"}},"char_filter": {"emoticons": {"type": "mapping","mappings": [":) => _happy_",":( => _sad_"]}},"filter": {"english_stop": {"type": "stop","stopwords": "_english_"}}}}}
2.应用自定义分析器验证
POST my_index/_analyze{"analyzer": "my_custom_analyzer","text": "I'm a :) person, and you?"}
3.验证结果
验证结果:[ i’m, happy, person, you ]
