分析过程:

  • 首先,将一块文本分成适合于倒排索引的独立的 词条
  • 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”

    组成成分

  • 分词器 tokenizer (必须)

  • 词过滤器 token filters (可选)
  • 字符过滤器 character filters (可选)


字符过滤器 首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and
分词器 其次,字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
Token 过滤器 最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 aandthe 等无用词),或者增加词条(例如,像 jumpleap 这种同义词)。

字符过滤器

字符过滤类型有以下三种:

1.HTML字符过滤器

  1. 删除文本中的HTML元素,并且将HTML实体替换成对应的解码值(例如用&替换&amp;)。<br />参数配置:
参数名称 说明
escaped_tags 在原始文本中要保留的一系列html标签

2.映射字符过滤器

映射字符过滤器接受键和值的map。每当遇到与key相同的字符串时,它将用与该key对应的value替换它们:

  • 匹配是贪婪的;会优先匹配最长键进行匹配和替换。
  • 允许替换为空字符串。

参数配置:

参数名称 参数说明
mappings 一组映射,每个元素的格式为key => value。
mappings_path 一个相对或者绝对的文件路径,指向一个每行包含一个 key =>value 映射的UTF-8编码文本映射文件。

以上两个参数必须提供一个。

  1. PUT mapping_char_filter_example_index
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "keyword",
  8. "char_filter": [
  9. "my_char_filter"
  10. ]
  11. }
  12. },
  13. "char_filter": {
  14. "my_char_filter": {
  15. "type": "mapping",
  16. "mappings": [
  17. "٠ => 0",
  18. "١ => 1",
  19. "٢ => 2",
  20. "٣ => 3",
  21. "٤ => 4",
  22. "٥ => 5",
  23. "٦ => 6",
  24. "٧ => 7",
  25. "٨ => 8",
  26. "٩ => 9"
  27. ],
  28. "mappings_path": "/app/resources/mappings.txt"
  29. }
  30. }
  31. }
  32. }
  33. }

过滤结果:[ My license plate is 25015 ]

  1. POST mapping_char_filter_example_index/_analyze
  2. {
  3. "analyzer": "my_analyzer",
  4. "text": "My license plate is ٢٥٠١٥"
  5. }

3.模式替换字符过滤器

使用正则表达式来匹配应替换为指定替换字符串的字符。替换字符串可以引用正则表达式中的捕获组。
配置参数**

参数名称 参数说明
pattern 一个Java正则表达式. 必填
replacement 替换字符串,可以使用$ 1 .. $ 9语法来引用捕获组,可以参考这里
flags Java正则表达式标志。 标志应该用“|”进行分割,例如“CASE_INSENSITIVE | COMMENTS”。
  1. PUT pattern_char_filter_example
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "standard",
  8. "char_filter": [
  9. "my_char_filter"
  10. ]
  11. }
  12. },
  13. "char_filter": {
  14. "my_char_filter": {
  15. "type": "pattern_replace",
  16. "pattern": "(\\d+)-(?=\\d)",
  17. "replacement": "$1_"
  18. }
  19. }
  20. }
  21. }
  22. }

过滤结果:[ My, credit, card, is, 123_456_789 ]

  1. POST pattern_char_filter_example/_analyze
  2. {
  3. "analyzer": "my_analyzer",
  4. "text": "My credit card is 123-456-789"
  5. }

一、内置分析器

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分析器对中文进行分词:

  1. GET _analyze
  2. {
  3. "analyzer": "standard",
  4. "text":"联想是全球最大的笔记本厂商"
  5. }

分词结果:

  1. {
  2. "tokens" : [
  3. {
  4. "token" : "联",
  5. "start_offset" : 0,
  6. "end_offset" : 1,
  7. "type" : "<IDEOGRAPHIC>",
  8. "position" : 0
  9. },
  10. {
  11. "token" : "想",
  12. "start_offset" : 1,
  13. "end_offset" : 2,
  14. "type" : "<IDEOGRAPHIC>",
  15. "position" : 1
  16. },
  17. {
  18. "token" : "是",
  19. "start_offset" : 2,
  20. "end_offset" : 3,
  21. "type" : "<IDEOGRAPHIC>",
  22. "position" : 2
  23. },
  24. {
  25. "token" : "全",
  26. "start_offset" : 3,
  27. "end_offset" : 4,
  28. "type" : "<IDEOGRAPHIC>",
  29. "position" : 3
  30. },
  31. {
  32. "token" : "球",
  33. "start_offset" : 4,
  34. "end_offset" : 5,
  35. "type" : "<IDEOGRAPHIC>",
  36. "position" : 4
  37. },
  38. {
  39. "token" : "最",
  40. "start_offset" : 5,
  41. "end_offset" : 6,
  42. "type" : "<IDEOGRAPHIC>",
  43. "position" : 5
  44. },
  45. {
  46. "token" : "大",
  47. "start_offset" : 6,
  48. "end_offset" : 7,
  49. "type" : "<IDEOGRAPHIC>",
  50. "position" : 6
  51. },
  52. {
  53. "token" : "的",
  54. "start_offset" : 7,
  55. "end_offset" : 8,
  56. "type" : "<IDEOGRAPHIC>",
  57. "position" : 7
  58. },
  59. {
  60. "token" : "笔",
  61. "start_offset" : 8,
  62. "end_offset" : 9,
  63. "type" : "<IDEOGRAPHIC>",
  64. "position" : 8
  65. },
  66. {
  67. "token" : "记",
  68. "start_offset" : 9,
  69. "end_offset" : 10,
  70. "type" : "<IDEOGRAPHIC>",
  71. "position" : 9
  72. },
  73. {
  74. "token" : "本",
  75. "start_offset" : 10,
  76. "end_offset" : 11,
  77. "type" : "<IDEOGRAPHIC>",
  78. "position" : 10
  79. },
  80. {
  81. "token" : "厂",
  82. "start_offset" : 11,
  83. "end_offset" : 12,
  84. "type" : "<IDEOGRAPHIC>",
  85. "position" : 11
  86. },
  87. {
  88. "token" : "商",
  89. "start_offset" : 12,
  90. "end_offset" : 13,
  91. "type" : "<IDEOGRAPHIC>",
  92. "position" : 12
  93. }
  94. ]
  95. }

2. 中文分析器 ik-analyzer

2.1 介绍

  • 是一个开源的,基于java语言开发的轻量级的中文分词工具包。
  • 支持细粒度和最大词长两种切分模式;
  • 具有83万字/秒(1600KB/S)的高速处理能力
  • 支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符
  • 支持用户词典扩展定义

    2.2 两种分词器

  • ik_max_word:最细粒度的拆分;尽可能多的拆分出词语

  • ik_smart: 最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有

    2.3 最细粒度分词器

    1. GET _analyze
    2. {
    3. "analyzer": "ik_max_word",
    4. "text":"联想是全球最大的笔记本厂商"
    5. }
    分词结果:联想、是、全球、最大、的、笔记本、笔记、本厂、厂商

token 是实际存储到索引中的词条。
position 指明词条在原始文本中出现的位置。
start_offsetend_offset 指明字符在原始字符串中的位置。

  1. {
  2. "tokens" : [
  3. {
  4. "token" : "联想",
  5. "start_offset" : 0,
  6. "end_offset" : 2,
  7. "type" : "CN_WORD",
  8. "position" : 0
  9. },
  10. {
  11. "token" : "是",
  12. "start_offset" : 2,
  13. "end_offset" : 3,
  14. "type" : "CN_CHAR",
  15. "position" : 1
  16. },
  17. {
  18. "token" : "全球",
  19. "start_offset" : 3,
  20. "end_offset" : 5,
  21. "type" : "CN_WORD",
  22. "position" : 2
  23. },
  24. {
  25. "token" : "最大",
  26. "start_offset" : 5,
  27. "end_offset" : 7,
  28. "type" : "CN_WORD",
  29. "position" : 3
  30. },
  31. {
  32. "token" : "的",
  33. "start_offset" : 7,
  34. "end_offset" : 8,
  35. "type" : "CN_CHAR",
  36. "position" : 4
  37. },
  38. {
  39. "token" : "笔记本",
  40. "start_offset" : 8,
  41. "end_offset" : 11,
  42. "type" : "CN_WORD",
  43. "position" : 5
  44. },
  45. {
  46. "token" : "笔记",
  47. "start_offset" : 8,
  48. "end_offset" : 10,
  49. "type" : "CN_WORD",
  50. "position" : 6
  51. },
  52. {
  53. "token" : "本厂",
  54. "start_offset" : 10,
  55. "end_offset" : 12,
  56. "type" : "CN_WORD",
  57. "position" : 7
  58. },
  59. {
  60. "token" : "厂商",
  61. "start_offset" : 11,
  62. "end_offset" : 13,
  63. "type" : "CN_WORD",
  64. "position" : 8
  65. }
  66. ]
  67. }


2.4 最粗粒度分词器

  1. GET _analyze
  2. {
  3. "analyzer": "ik_smart",
  4. "text":"联想是全球最大的笔记本厂商"
  5. }

分词结果:联想、是、全球、最大、的、笔记本、厂商

  1. {
  2. "tokens" : [
  3. {
  4. "token" : "联想",
  5. "start_offset" : 0,
  6. "end_offset" : 2,
  7. "type" : "CN_WORD",
  8. "position" : 0
  9. },
  10. {
  11. "token" : "是",
  12. "start_offset" : 2,
  13. "end_offset" : 3,
  14. "type" : "CN_CHAR",
  15. "position" : 1
  16. },
  17. {
  18. "token" : "全球",
  19. "start_offset" : 3,
  20. "end_offset" : 5,
  21. "type" : "CN_WORD",
  22. "position" : 2
  23. },
  24. {
  25. "token" : "最大",
  26. "start_offset" : 5,
  27. "end_offset" : 7,
  28. "type" : "CN_WORD",
  29. "position" : 3
  30. },
  31. {
  32. "token" : "的",
  33. "start_offset" : 7,
  34. "end_offset" : 8,
  35. "type" : "CN_CHAR",
  36. "position" : 4
  37. },
  38. {
  39. "token" : "笔记本",
  40. "start_offset" : 8,
  41. "end_offset" : 11,
  42. "type" : "CN_WORD",
  43. "position" : 5
  44. },
  45. {
  46. "token" : "厂商",
  47. "start_offset" : 11,
  48. "end_offset" : 13,
  49. "type" : "CN_WORD",
  50. "position" : 6
  51. }
  52. ]
  53. }

三、拼音分词器 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

四、为索引字段配置分析器

  1. PUT /analyzer-test
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "ik":{
  7. "tokenizer" : "ik_max_word"
  8. }
  9. }
  10. }
  11. },
  12. "mappings": {
  13. "article":{
  14. "dynamic":true,
  15. "properties":{
  16. "subject":{
  17. "type":"text",
  18. "analyzer":"ik_max_word"
  19. }
  20. }
  21. }
  22. }
  23. }

增加数据

  1. POST /analyzer-test/article/_bulk
  2. { "index" : { "_id" : "1" } }
  3. {"subject" : ""闺蜜"崔顺实被韩检方传唤 韩总统府促彻查真相" }
  4. { "index" : { "_id" : "2" } }
  5. {"subject" : "韩举行"护国训练" 青瓦台:决不许国家安全出问题" }
  6. { "index" : { "_id" : "3" } }
  7. {"subject" : "媒体称FBI已经取得搜查令 检视希拉里电邮" }
  8. { "index" : { "_id" : "4" } }
  9. {"subject" : "村上春树获安徒生奖 演讲中谈及欧洲排外问题" }
  10. { "index" : { "_id" : "5" } }
  11. {"subject" : "希拉里团队炮轰FBI 参院民主党领袖批其“违法”" }

查询语法及查询结果

  1. POST /analyzer-test/article/_search
  2. {
  3. "query" : { "match" : { "subject" : "希拉里和韩国" }},
  4. "highlight" : {
  5. "pre_tags" : ["<font color='red'>"],
  6. "post_tags" : ["</font>"],
  7. "fields" : {
  8. "subject" : {}
  9. }
  10. }
  11. }
  1. {
  2. "took" : 62,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 5,
  6. "successful" : 5,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : 2,
  12. "max_score" : 0.2876821,
  13. "hits" : [
  14. {
  15. "_index" : "analyzer-test",
  16. "_type" : "article",
  17. "_id" : "5",
  18. "_score" : 0.2876821,
  19. "_source" : {
  20. "subject" : "希拉里团队炮轰FBI 参院民主党领袖批其“违法”"
  21. },
  22. "highlight" : {
  23. "subject" : [
  24. "<font color='red'>希拉里</font>团队炮轰FBI 参院民主党领袖批其“违法”"
  25. ]
  26. }
  27. },
  28. {
  29. "_index" : "analyzer-test",
  30. "_type" : "article",
  31. "_id" : "3",
  32. "_score" : 0.2876821,
  33. "_source" : {
  34. "subject" : "媒体称FBI已经取得搜查令 检视希拉里电邮"
  35. },
  36. "highlight" : {
  37. "subject" : [
  38. "媒体称FBI已经取得搜查令 检视<font color='red'>希拉里</font>电邮"
  39. ]
  40. }
  41. }
  42. ]
  43. }
  44. }

五、创建自定义分析器(简单)

一个自定义分析器的配置参数:

tokenizer 内置或自定义的标记器。(必需)
char_filter 内置或自定义 字符过滤器的数组。(可选)
filter 内置或自定义Token 过滤器的数组。(可选)
position_increment_gap 文本值数组编制索引时,Elasticsearch会在一个值的最后一个项和下一个值的第一个项之间插入一个“间隙”(数组元素之间插入间隙),以确保短语查询与来自不同数组元素的两个项不匹配。默认为100

1.创建自定义分析器

  1. PUT my_index
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_custom_analyzer": {
  7. "type": "custom",
  8. "tokenizer": "standard",
  9. "char_filter": [
  10. "html_strip"
  11. ],
  12. "filter": [
  13. "lowercase",
  14. "asciifolding"
  15. ]
  16. }
  17. }
  18. }
  19. }
  20. }

2.应用自定义分析器验证

  1. POST my_index/_analyze
  2. {
  3. "analyzer": "my_custom_analyzer",
  4. "text": "Is this <b>déjà vu</b>?"
  5. }

3.验证结果

验证结果:[ is, this, deja, vu ]

  1. {
  2. "tokens" : [
  3. {
  4. "token" : "is",
  5. "start_offset" : 0,
  6. "end_offset" : 2,
  7. "type" : "<ALPHANUM>",
  8. "position" : 0
  9. },
  10. {
  11. "token" : "this",
  12. "start_offset" : 3,
  13. "end_offset" : 7,
  14. "type" : "<ALPHANUM>",
  15. "position" : 1
  16. },
  17. {
  18. "token" : "deja",
  19. "start_offset" : 11,
  20. "end_offset" : 15,
  21. "type" : "<ALPHANUM>",
  22. "position" : 2
  23. },
  24. {
  25. "token" : "vu",
  26. "start_offset" : 16,
  27. "end_offset" : 22,
  28. "type" : "<ALPHANUM>",
  29. "position" : 3
  30. }
  31. ]
  32. }

六、创建自定义分析器(复杂)

1.创建自定义分析器

  • 字符串过滤器配置:将:)替换为“happy”和:(替换为“sad
  • 分词器配置:模式标记器,配置为在标点字符上拆分
  • Token过滤器配置:1.小写token过滤器 2.无用(停用)词过滤,配置为使用预定义的英文停止词列表
    1. PUT compact_analyzer
    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. }

    2.应用自定义分析器验证

    1. POST my_index/_analyze
    2. {
    3. "analyzer": "my_custom_analyzer",
    4. "text": "I'm a :) person, and you?"
    5. }

    3.验证结果

    验证结果:[ i’m, happy, person, you ]