1.分词器原理

在全文搜索(Fulltext Search)中,词(Term)是一个搜索单元,表示文本中的一个词,标记(Token)表示在文本字段中出现的词,由词的文本、在原始文本中的开始和结束偏移量、以及数据类型等组成。
ElasticSearch 把文档数据写到倒排索引(Inverted Index)的结构中,倒排索引建立词(Term)和文档之间的映射,索引中的数据是面向词,而不是面向文档的。分析器(Analyzer)的作用就是分析(Analyse),用于把传入Lucene的文档数据转化为倒排索引,把文本处理成可被搜索的词。
分析器由一个分词器(Tokenizer)和零个或多个标记过滤器(TokenFilter)组成,也可以包含零个或多个字符过滤器(Character Filter)。
在ElasticSearch引擎中,分析器的任务是分析(Analyze)文本数据,分析是分词,规范化文本的意思,如图所示,其工作流程如下:

  • 首先,字符过滤器(Character Filter)对分析(analyzed)文本进行过滤和处理,例如从原始文本中移除HTML标记,根据字符映射替换文本等,
  • 过滤之后的文本被分词器(Tokenizer)接收,分词器把文本分割成标记流,也就是一个接一个的标记,
  • 然后,标记过滤器对标记流进行过滤处理(Token Filters),例如,移除停用词,把词转换成其词干形式,把词转换成其同义词等,
  • 最终,过滤之后的标记流被存储在倒排索引中;

21477100_1629705095.png
根据上述规则Elasticsearch会为大家提供一些内置分词器:

  • Standard Analyzer - 默认分词器,按词切分,小写处理
  • Simple Analyzer - 按照非字母切分(符号被过滤), 小写处理
  • Stop Analyzer - 小写处理,停用词过滤(the,a,is)
  • Whitespace Analyzer - 按照空格切分,不转小写
  • Keyword Analyzer - 不分词,直接将输入当作输出
  • Patter Analyzer - 正则表达式,默认\W+(非字符分割)
  • Language - 提供了30多种常见语言的分词器
  • Customer Analyzer 自定义分词器

当然也可以根据自己的需要自定义分词器。
如图所示,我们可以通过setting-analysis-analyzer的方式自定义分词器,其中需要设置type为custom,tokenizer选择了Elasticsearch提供的standard,filter使用了lowercase(小写转换)和asciifolding。定义完成以后,可以在mapping中使用,在对应字段的analyzer属性中可以设置定义好的分词器的名字std_folded。
49547000_1629705095.png

2.IK分词器

2.1.安装

  1. 下载插件 https://github.com/medcl/elasticsearch-analysis-ik/releases
  2. 解压至plugins目录

    1. mkdir ik
    2. unzip elasticsearch-analysis-ik-7.15.0.zip ik
    3. mv ik /elasticsearch-7.15.0/plugins
  3. 重启es

    2.2.测试

    1. GET _analyze
    2. {
    3. "analyzer": "ik_max_word",
    4. "text": "中华人民共和国"
    5. }

    结果:

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