伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

Elasticsearch Analyzer 内置分词器使用示例详解

目录

    前置知识1.Analyzer2.Elasticsearch 内置分词器3. Standard Analyzer
      3.1 Definition3.2 Configuration3.3 实验
    4. Simple Analyzer
      4.1 Definition4.2 Configuation4.3 实验
    5. Stop Analyzer
      5.1 Definition5.2 Configuration5.3 实验
    6. Whitespace Analyzer
      6.1 Definition6.2 Configuration6.3 实验
    7. Keyword Analyzer
      7.1 Definition7.2 Configuration7.3 实验
    8. Patter Analyzer
      8.1 Definition8.2 Configuration8.3 实验
    9. Language Analyzer10. Customer Analyzer总结


前置知识

主要介绍一下 Elasticsearch中 Analyzer 分词器的构成 和一些Es中内置的分词器 以及如何使用它们
Elasticsearch Analyzer 内置分词器使用示例详解-1.png

es 提供了 analyze api 可以方便我们快速的指定 某个分词器 然后对输入的text文本停止分词 协助我们学习和实验分词器
  1. POST _analyze
  2. {
  3.   "analyzer": "standard",
  4.   "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }
  6. [ 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 查询时候 需要对查询文本 停止分词
Elasticsearch Analyzer 内置分词器使用示例详解-2.png


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 文本分割算法去 对文本停止分词的
  1. POST _analyze
  2. {
  3.   "analyzer": "standard",
  4.   "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }
  6. [ 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 255stopwords : 预定义的停顿词列表 如: _ _ englisth _ _ 或者 停顿词数组[] 默认 none 不设置stopwords_path : 包含停顿词的文件途径

3.3 实验
  1. // 使用 自定义的分词器 基于 standard
  2. PUT my_index
  3. {
  4.   "settings": {
  5.     "analysis": {
  6.       "analyzer": {
  7.         "my_english_analyzer": {
  8.           "type": "standard",
  9.           "max_token_length": 5, // 最大词数
  10.           "stopwords": "_english_" // 开启过滤停顿词 使用 englisth 语法
  11.         }
  12.       }
  13.     }
  14.   }
  15. }
  16. GET my_index/_analyze
  17. {
  18.   "analyzer": "my_english_analyzer",
  19.   "text": "The hellogoodname jack"
  20. }
  21. // 可以看到 最长5个字符 就需要停止分词了, 并且停顿词 the 没有了
  22. ["hello", "goodn", "ame", "jack"]
复制代码
4. Simple Analyzer

简单的分词器 分词规则就是 遇到 非字母的 就分词, 并且转化为小写,(lowercase tokennizer )
  1. POST _analyze
  2. {
  3.   "analyzer": "simple",
  4.   "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }
  6. [ 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 分词器的实现 就是如下
  1. PUT /simple_example
  2. {
  3.   "settings": {
  4.     "analysis": {
  5.       "analyzer": {
  6.         "rebuilt_simple": {
  7.           "tokenizer": "lowercase",
  8.           "filter": [         
  9.           ]
  10.         }
  11.       }
  12.     }
  13.   }
  14. }
复制代码
5. Stop Analyzer

stop analyzer 和 simple analyzer 一样, 只是多了 过滤 stop word 的 token filter , 并且默认使用 english 停顿词规则
  1. POST _analyze
  2. {
  3.   "analyzer": "stop",
  4.   "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }
  6. // 可以看到 非字母停止分词 并且转小写 然后 去除了停顿词
  7. [ 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 的实现 , 先转小写 后停止停顿词的过滤
  1. PUT /stop_example
  2. {
  3.   "settings": {
  4.     "analysis": {
  5.       "filter": {
  6.         "english_stop": {
  7.           "type":       "stop",
  8.           "stopwords":  "_english_"
  9.         }
  10.       },
  11.       "analyzer": {
  12.         "rebuilt_stop": {
  13.           "tokenizer": "lowercase",
  14.           "filter": [
  15.             "english_stop"         
  16.           ]
  17.         }
  18.       }
  19.     }
  20.   }
  21. }
复制代码
设置 stopwords 参数 指定过滤的停顿词列表
  1. PUT my_index
  2. {
  3.   "settings": {
  4.     "analysis": {
  5.       "analyzer": {
  6.         "my_stop_analyzer": {
  7.           "type": "stop",
  8.           "stopwords": ["the", "over"]
  9.         }
  10.       }
  11.     }
  12.   }
  13. }
  14. POST my_index/_analyze
  15. {
  16.   "analyzer": "my_stop_analyzer",
  17.   "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  18. }
  19. [ quick, brown, foxes, jumped, lazy, dog, s, bone ]
复制代码
6. Whitespace Analyzer

空格 分词器, 顾名思义 遇到空格就停止分词, 不会转小写
  1. POST _analyze
  2. {
  3.   "analyzer": "whitespace",
  4.   "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }
  6. [ 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
  1. PUT /whitespace_example
  2. {
  3.   "settings": {
  4.     "analysis": {
  5.       "analyzer": {
  6.         "rebuilt_whitespace": {
  7.           "tokenizer": "whitespace",
  8.           "filter": [         
  9.           ]
  10.         }
  11.       }
  12.     }
  13.   }
  14. }
复制代码
7. Keyword Analyzer

很特殊 它不会停止分词, 怎么输入 就怎么输出
  1. POST _analyze
  2. {
  3.   "analyzer": "keyword",
  4.   "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }
  6. //注意 这里并没有停止分词 而是原样输出
  7. [ 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 实现
  1. PUT /keyword_example
  2. {
  3.   "settings": {
  4.     "analysis": {
  5.       "analyzer": {
  6.         "rebuilt_keyword": {
  7.           "tokenizer": "keyword",
  8.           "filter": [         
  9.           ]
  10.         }
  11.       }
  12.     }
  13.   }
  14. }
复制代码
8. Patter Analyzer

正则表达式 停止拆分 ,注意 正则匹配的是 标志, 就是要被分词的标志 默认是 依照 \w+ 正则分词
  1. POST _analyze
  2. {
  3.   "analyzer": "pattern",
  4.   "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }
  6. // 默认是 依照 \w+ 正则
  7. [ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
复制代码
8.1 Definition

Tokennizer
    Pattern Tokenizer
Token Filters
    Lower Case Token FilterStop Token Filter (默认未开启)

8.2 Configuration

patternA Java regular expression, defaults to \W+.
flagsJava regular expression.
lowercase转小写 默认开启 true.
stopwords停顿词过滤 默认none 未开启 , Defaults to _none_.
stopwords_path停顿词文件途径

8.3 实验

Pattern Analyzer 的实现 就是如下
  1. PUT /pattern_example
  2. {
  3.   "settings": {
  4.     "analysis": {
  5.       "tokenizer": {
  6.         "split_on_non_word": {
  7.           "type":       "pattern",
  8.           "pattern":    "\\W+"
  9.         }
  10.       },
  11.       "analyzer": {
  12.         "rebuilt_pattern": {
  13.           "tokenizer": "split_on_non_word",
  14.           "filter": [
  15.             "lowercase"      
  16.           ]
  17.         }
  18.       }
  19.     }
  20.   }
  21. }
复制代码
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.
  1. GET _analyze
  2. {
  3.   "analyzer": "english",
  4.   "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
  5. }
  6. [ 2, quick, brown, foxes, jumped, over, lazy, dog, bone ]
复制代码
10. Customer Analyzer

没啥好说的 就是当提供的 内置分词器不满足你的需求的时候 ,你可以结合 如下3部分
    Character Filters : 主要对原文本做处置, 例如 去除 html 标签Tokenizer : 依照规则 把文本切分为单词, 也就是分词Token Filters : 将切分后的单词 停止加工处置, 小写,删除stopwords 停顿词, 增加同义词 , 扩展一些
  1. PUT my_index
  2. {
  3.   "settings": {
  4.     "analysis": {
  5.       "analyzer": {
  6.         "my_custom_analyzer": {
  7.           "type": "custom",
  8.           "char_filter": [
  9.             "emoticons"
  10.           ],
  11.           "tokenizer": "punctuation",
  12.           "filter": [
  13.             "lowercase",
  14.             "english_stop"
  15.           ]
  16.         }
  17.       },
  18.       "tokenizer": {
  19.         "punctuation": {
  20.           "type": "pattern",
  21.           "pattern": "[ .,!?]"
  22.         }
  23.       },
  24.       "char_filter": {
  25.         "emoticons": {
  26.           "type": "mapping",
  27.           "mappings": [
  28.             ":) => _happy_",
  29.             ":( => _sad_"
  30.           ]
  31.         }
  32.       },
  33.       "filter": {
  34.         "english_stop": {
  35.           "type": "stop",
  36.           "stopwords": "_english_"
  37.         }
  38.       }
  39.     }
  40.   }
  41. }
  42. POST my_index/_analyze
  43. {
  44.   "analyzer": "my_custom_analyzer",
  45.   "text":     "I'm a :) person, and you?"
  46. }
  47. [ i'm, _happy_, person, you ]
复制代码
总结

本篇主要介绍了 Elasticsearch 中 的一些 内置的 Analyzer 分词器, 这些内置分词器可能不会常用,但是假设你能好好梳理一下这些内置 分词器,一定会对你理解Analyzer 有很大的协助, 可以协助你理解 Character Filters , Tokenizer 和 Token Filters 的用处.
有时机再聊聊 一些中文分词器 如 IKAnalyzer, ICU Analyzer ,Thulac 等等.. 毕竟开发中 中文分词器用到更多些
以上就是Elasticsearch Analyzer 内置分词器使用示例详解的详细内容,更多关于Elasticsearch Analyzer分词器的资料请关注网站其它相关文章!

回复

举报 使用道具

相关帖子
全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

桦艺
注册会员
主题 21
回复 24
粉丝 0
|网站地图
快速回复 返回顶部 返回列表