前言
- 本文是ES
mapping
映射参数第一期~Analyzer
。 - 文中使用 ES
versions
7.1,其他版本可能有偏差。 - mapping 映射参数预计是每周
3
章,有喜欢的欢迎关注,一起交流学习
一、Analyzer 概念
官方解释:以将字符串转换为标记或 术语流 。
白话:根据选择不同的分析器进行语句拆分。
例如:"The quick Brown Foxes.",根据使用的分析器,字符串可能会被分析为标记:quick、brown、 fox。这些是为该字段编制索引的实际术语,这使得在 大块文本中有效地搜索单个单词成为可能
Analyzer 由三部分组成:字符过滤器、 标记器和标记过滤器
-
字符过滤器(character filter)
:接收原字符流,通过添加、删除或者替换操作改变原字符流。例如:去除文本中的html标签,或者将罗马数字转换成阿拉伯数字等。一个字符过滤器可以有零个或者多个 -
分词器(tokenizer)
:分词器接收一个 字符流,将其分解为单个 令牌(通常是单个单词),并输出一个令牌流。例如,whitespace标记器在看到任何空格时将文本分解为标记。它会将文本 "Quick brown fox!"转换为术语[Quick, brown, fox!]。 -
令牌过滤器(token filters)
:令牌过滤器接收令牌流并可以添加、删除或更改令牌。例如,lowercase记号过滤器将所有记号转换为小写, 记号过滤器从记号流 stop中删除常用词(停用词) ,记号过滤器将同义词引入记号流。
二 示例解析
先看 Character filter
使用char_filter
定义 ,目前ES提供了三种:
- HTML Strip Char Filter
- Mapping Char Filter
- Pattern Replace Char Filter
我们以 HTML Strip Char Filter(HTML条形过滤器)
讲解 字符过滤器。先来看不带
字符过滤的 :
POST _analyze?pretty
{
"tokenizer": "keyword",
"text": "<p>I'm so <b>happy</b>!</p>"
}
可以看到解析过后连HTML标签也一起返回了,下面我们希望过滤掉这些html标签:
POST _analyze?pretty
{
"tokenizer": "keyword",
"char_filter": [ "html_strip" ],
"text": "<p>I'm so <b>happy</b>!</p>"
}
我们通过添加 "char_filter": [ "html_strip" ]
解决了去掉html,本处就不对另外两种做分析了,有喜欢的小伙伴可查看问后链接查看文档,具体使用也是很简单。
再看 tokenizer
分词器使用tokenizer
定义
目前ES 对 分词器提供的很多,此处不全还有很多
例如 :
- Standard Tokenizer - 标准分词器,也是ES默认的一个,一会就以他为示例
- Simple Analyzer – 按照非字母切分(符号被过滤),小写处理
- Stop Analyzer – 小写处理,停用词过滤(the,a,is)
- Whitespace Analyzer – 按照空格切分,不转小写
- Keyword Analyzer – 不分词,直接将输入当作输出
- Patter Analyzer – 正则表达式,默认 \W+ (非字符分隔)
- Language – 提供了30多种常见语言的分词器
上代码:
#查看不同的analyzer的效果
#standard
GET _analyze
{
"analyzer": "standard",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
#simpe
GET _analyze
{
"analyzer": "simple",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
GET _analyze
{
"analyzer": "stop",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
#stop
GET _analyze
{
"analyzer": "whitespace",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
#keyword
GET _analyze
{
"analyzer": "keyword",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
GET _analyze
{
"analyzer": "pattern",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
#english
GET _analyze
{
"analyzer": "english",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
POST _analyze
{
"analyzer": "icu_analyzer",
"text": "他说的确实在理”"
}
POST _analyze
{
"analyzer": "standard",
"text": "他说的确实在理”"
}
POST _analyze
{
"analyzer": "icu_analyzer",
"text": "这个苹果不大好吃"
}
是不是使用 icu_analyzer
会报错?不要慌了,这个属于ES 的一个插件,中文分词基本是要自己以插件的形式放在里面,其他中文分词插件还有:ik_max_word ik_smart
, 现在也没必要了解这些,有需要的可单独出一章说明怎样安装中文分词,文后也有链接可自行下载进行安装.
最后再看令牌过滤器 token filters
使用filter
定义 :
Es 也是提供了很多
的列如:
- Lowercase Token Filter 小写标记过滤
- Uppercase Token Filter 大写标记过滤
- Stop Token Filter 此处以 停用词为示例
GET _analyze
{
"tokenizer": "standard",
"filter": ["stop"],
"text": ["The gilrs in China are playing this game!"]
}
此示例就会过滤掉 IN are 这种词
最强应用 使用 字符过滤器 使用 html_strip ,分词器 使用 standard,令牌过滤器 使用 stop
组合再一起:
GET _analyze
{
"tokenizer": "standard",
"filter": ["stop"],
"char_filter":[ "html_strip" ],
"text": "<p>The in gilrs</p>"
}
终极玩法 自定义分词器 和上面一样组合再一起应用
curl -X PUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
}
}
'
curl -X POST "localhost:9200/my_index/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
"analyzer": "my_custom_analyzer",
"text": "Is this <b>déjà vu</b>?"
}
'
文末:
本文就到此结束了,快来一起学习吧~
注:如果此文有增加新的内容会同步更新
tokenizer 和 filte
r 是可以定义多个的。
三 文后
字符过滤器参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/analysis-charfilters.html
分词器参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/analysis-tokenizers.html
令牌过滤器参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/analysis-tokenfilters.html
IK分词器地址:https://github.com/medcl/elasticsearch-analysis-ik
ICU中文分词下载地址:https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-icu/analysis-icu-7.1.0.zip