共计 6152 个字符,预计需要花费 16 分钟才能阅读完成。
Elasticsearch Analyzer 内置分词器
篇次要介绍一下 Elasticsearch 中 Analyzer 分词器的形成 和一些 Es 中内置的分词器 以及如何应用它们
前置常识
es 提供了 analyze api 能够不便咱们疾速的指定 某个分词器 而后对输出的 text 文本进行分词 帮忙咱们学习和试验分词器
POST _analyze
{
"analyzer": "standard",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
[the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone]
1.Analyzer
在 ES 中有很重要的一个概念就是 分词
,ES 的全文检索也是基于分词联合倒排索引做的。所以这一文咱们来看下何谓之分词。如何分词。
分词器是专门解决分词的组件,在很多中间件设计中每个组件的职责都划分的很分明,繁多职责准则,当前改的时候好扩大。
分词器由三局部组成。
- Character Filters : 次要对原文本做解决, 例如 去除 html 标签
- Tokenizer : 依照规定 把文本切分为单词, 也就是分词
- Token Filters : 将切分后的单词 进行加工解决, 小写, 删除 stopwords 进展词, 减少同义词 , 扩大一些
分词场景:
- 数据写入 index 的时候进行分词
- query 查问时候 须要对查问文本 进行分词
2.Elasticsearch 内置分词器
在 es 中有不少内置分词器
- Standard Analyzer : 默认分词器, 按 Unicode 文本宰割算法拆分 , 转化为小写 , 反对中文 (然而中文依照每个文字拆分, 没啥意义)
- Simple Analyzer : 依照非字母切分 并且转化为小写
- Stop Analyzer : 和 simple 一样 然而多了 过滤停用词 (the a is) 默认应用 stop token filter 的 english 预约义
- Whitespace Analyzer : 每当遇到 空格的时候 会进行分词 , 不会转小写
- Keyword Analyzer : 不分词 间接将输出当做输入
- Patter Analyzer : 正则表达式
- Language : 语言分词器 30 多种
- Customer Analyzer : 自定义分词器
3. Standard Analyzer
Standard 是 es 中默认的分词器 , 它是依照 Unicode 文本宰割算法去 对文本进行分词的
POST _analyze
{
"analyzer": "standard",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
[the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone]
3.1 Definition
包含了 转小写的 token filter 和 stop token filter 去除进展词
Tokenizer
- [Standard Tokenizer]
Token Filters
- [Standard Token Filter] : 没用只是作为保留的 token filter (The
standard
token filter currently does nothing. It remains as a placeholder in case some filtering function needs to be added in a future version.) - [Lower Case Token Filter] : 转小写的 token filter
- [Stop Token Filter] : 进展词 token filter
默认是没有开启
3.2 Configuration
- max_token_length : 最大的分词长度, 如果超过此长度 则间接分词 default 255
- stopwords : 预约义的进展词列表 如: englisth 或者 进展词数组 [] 默认 none 不设置
- stopwords_path : 蕴含进展词的文件门路
3.3 试验
// 应用 自定义的分词器 基于 standard
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_english_analyzer": {
"type": "standard",
"max_token_length": 5, // 最大词数
"stopwords": "_english_" // 开启过滤进展词 应用 englisth 语法
}
}
}
}
}
GET my_index/_analyze
{
"analyzer": "my_english_analyzer",
"text": "The hellogoodname jack"
}
// 能够看到 最长 5 个字符 就须要进行分词了, 并且进展词 the 没有了
["hello", "goodn", "ame", "jack"]
4. Simple Analyzer
简略的分词器 分词规定就是 遇到 非字母的 就分词, 并且转化为小写,(lowercase tokennizer)
POST _analyze
{
"analyzer": "simple",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
[the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone]
4.1 Definition
Tokenizer
- Lower Case Tokenizer
4.2 Configuation
无配置参数
4.3 试验
simple analyzer 分词器的实现 就是如下
PUT /simple_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_simple": {
"tokenizer": "lowercase",
"filter": []}
}
}
}
}
5. Stop Analyzer
stop analyzer 和 simple analyzer 一样, 只是多了 过滤 stop word 的 token filter , 并且默认应用 english 进展词规定
POST _analyze
{
"analyzer": "stop",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
// 能够看到 非字母进行分词 并且转小写 而后 去除了进展词
[quick, brown, foxes, jumped, over, lazy, dog, s, bone]
5.1 Definition
Tokenizer
- Lower Case Tokenizer : 转小写的
Token filters
- Stop Token Filter : 过滤进展词 默认应用 规定 english
5.2 Configuration
- stopwords : 指定分词的规定 默认 english , 或者分词的数组
- stopwords_path : 指定分词进展词文件
5.3 试验
如下就是对 Stop Analyzer 的实现 , 先转小写 后进行进展词的过滤
PUT /stop_example
{
"settings": {
"analysis": {
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
},
"analyzer": {
"rebuilt_stop": {
"tokenizer": "lowercase",
"filter": ["english_stop"]
}
}
}
}
}
设置 stopwords 参数 指定过滤的进展词列表
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_stop_analyzer": {
"type": "stop",
"stopwords": ["the", "over"]
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_stop_analyzer",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
[quick, brown, foxes, jumped, lazy, dog, s, bone]
6. Whitespace Analyzer
空格 分词器, 顾名思义 遇到空格就进行分词, 不会转小写
POST _analyze
{
"analyzer": "whitespace",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
[The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone.]
6.1 Definition
Tokenizer
- Whitespace Tokenizer
6.2 Configuration
无配置
6.3 试验
whitespace analyzer 的实现就是如下, 能够依据理论状况进行 增加 filter
PUT /whitespace_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_whitespace": {
"tokenizer": "whitespace",
"filter": []}
}
}
}
}
7. Keyword Analyzer
很非凡 它不会进行分词, 怎么输出 就怎么输入
POST _analyze
{
"analyzer": "keyword",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
// 留神 这里并没有进行分词 而是原样输入
[The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.]
7.1 Definition
Tokennizer
- Keyword Tokenizer
7.2 Configuration
无配置
7.3 试验
rebuit 如下 就是 Keyword Analyzer 实现
PUT /keyword_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_keyword": {
"tokenizer": "keyword",
"filter": []}
}
}
}
}
8. Patter Analyzer
正则表达式 进行拆分 , 留神 正则匹配的是 标记, 就是要被分词的标记 默认是 依照 \w+ 正则分词
POST _analyze
{
"analyzer": "pattern",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
// 默认是 依照 \w+ 正则
[the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone]
8.1 Definition
Tokennizer
- Pattern Tokenizer
Token Filters
- Lower Case Token Filter
- Stop Token Filter (默认未开启)
8.2 Configuration
pattern |
A Java regular expression, defaults to \W+ . |
---|---|
flags |
Java regular expression. |
lowercase |
转小写 默认开启 true . |
stopwords |
进展词过滤 默认 none 未开启 , Defaults to _none_ . |
stopwords_path |
进展词文件门路 |
8.3 试验
Pattern Analyzer 的实现 就是如下
PUT /pattern_example
{
"settings": {
"analysis": {
"tokenizer": {
"split_on_non_word": {
"type": "pattern",
"pattern": "\\W+"
}
},
"analyzer": {
"rebuilt_pattern": {
"tokenizer": "split_on_non_word",
"filter": ["lowercase"]
}
}
}
}
}
9. Language Analyzer
提供了如下 这么多语言分词器 , 其中 english 也在其中
arabic
, armenian
, basque
, bengali
, bulgarian
, catalan
, czech
, dutch
, english
, finnish
, french
, galician
, german
, hindi
, hungarian
, indonesian
, irish
, italian
, latvian
, lithuanian
, norwegian
, portuguese
, romanian
, russian
, sorani
, spanish
, swedish
, turkish
.
GET _analyze
{
"analyzer": "english",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
[2, quick, brown, foxes, jumped, over, lazy, dog, bone]
10. Customer Analyzer
没啥好说的 就是当提供的 内置分词器不满足你的需要的时候 , 你能够联合 如下 3 局部
- Character Filters : 次要对原文本做解决, 例如 去除 html 标签
- Tokenizer : 依照规定 把文本切分为单词, 也就是分词
- Token Filters : 将切分后的单词 进行加工解决, 小写, 删除 stopwords 进展词, 减少同义词 , 扩大一些
PUT my_index
{
"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_"
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "I'm a :) person, and you?"
}
[i'm, _happy_, person, you]
总结
本篇次要介绍了 Elasticsearch 中 的一些 内置的 Analyzer 分词器, 这些内置分词器可能不会罕用, 然而如果你能好好梳理一下这些内置 分词器, 肯定会对你了解 Analyzer 有很大的帮忙, 能够帮忙你了解 Character Filters , Tokenizer 和 Token Filters 的用途.
有机会再聊聊 一些中文分词器 如 IKAnalyzer, ICU Analyzer ,Thulac 等等.. 毕竟开发中 中文分词器用到更多些
欢送大家拜访 集体博客 Johnny 小屋
欢送关注集体公众号