• es 分词器详解


    基本概念

    分词器官方称之为文本分析器,顾名思义,是对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。

    分词器发生的时期

    1、分词器的处理过程发生在索引文档创建时期

    2、搜索时期,对搜索词进行分词

    分词器的组成

    • 切词器(Tokenizer):用于定义切词(分词)逻辑
    • 词项过滤器(Token Filter):用于对分词之后的单个词项的处理逻辑
    • 字符过滤器(Character Filter):用于处理单个字符

    注意:分词器不会对源数据产生影响,分词只是对倒排索引以及搜索词的行为

    切词器:Tokenizer

    tokenizer 是分词器的核心组成部分之一,其主要作用是分词,或称之为切词。主要用来对原始文本进行细粒度拆分。拆分之后的每一个部分称之为一个 Term,或称之为一个词项。可以把切词器理解为预定义的切词规则。官方内置了很多种切词器,默认的切词器为 standard。

    词项过滤器:Token Filter

    词项过滤器用来处理切词完成之后的词项,例如把大小写转换,删除停用词或同义词处理等。官方同样预置了很多词项过滤器,基本可以满足日常开发的需要。当然也是支持第三方也自行开发的。

    比如转为大写:

    转为小写:

    1. #转为大写
    2. GET _analyze
    3. {
    4. "tokenizer": "standard",
    5. "filter": ["uppercase"],
    6. "text": ["www elastic co guide"]
    7. }
    8. #转为小写
    9. GET _analyze
    10. {
    11. "tokenizer": "standard",
    12. "filter": ["lowercase"],
    13. "text": ["WWW ELASTIC CO GUIDE"]
    14. }

    停用词

    在切词完成之后,会被干掉词项,即停用词。停用词可以自定义

    在分词器插件的配置文件中可以看到停用词的定义

    比如 ik 分词器定义的停用词如下

    演示:

    可以看到 are 被停用了

    1. # 停用词
    2. GET _analyze
    3. {
    4. "tokenizer": "standard",
    5. "filter": ["stop"],
    6. "text": ["what are you doing"]
    7. }

    也可以自定义停用词:

    1. ### 自定义 filter
    2. PUT test_token_filter_stop
    3. {
    4. "settings": {
    5. "analysis": {
    6. "filter": {
    7. "my_filter": {
    8. "type": "stop",
    9. "stopwords": [
    10. "www"
    11. ],
    12. "ignore_case": true
    13. }
    14. }
    15. }
    16. }
    17. }
    18. GET test_token_filter_stop/_analyze
    19. {
    20. "tokenizer": "standard",
    21. "filter": ["my_filter"],
    22. "text": ["What www WWW are you doing"]
    23. }

    同义词

    同义词定义规则

    • a, b, c => d:这种方式,a、b、c 会被 d 代替。
    • a, b, c, d:这种方式下,a、b、c、d 是等价的。

    1. #同义词
    2. PUT test_token_filter_synonym
    3. {
    4. "settings": {
    5. "analysis": {
    6. "filter": {
    7. "my_synonym": {
    8. "type": "synonym",
    9. "synonyms": ["good, nice => excellent"]
    10. }
    11. }
    12. }
    13. }
    14. }
    15. GET test_token_filter_synonym/_analyze
    16. {
    17. "tokenizer": "standard",
    18. "filter": ["my_synonym"],
    19. "text": ["good"]
    20. }

    字符过滤器:Character Filter

    分词之前的预处理,过滤无用字符。

    html 标签过滤器

    type:html_strip  表示过滤 html 标签

    escaped_tags:  表示需要保留的标签

    下面示例,可以看到 p 标签被过滤,而 a 标签保留

    1. #字符过滤器
    2. PUT test_html_strip_filter
    3. {
    4. "settings": {
    5. "analysis": {
    6. "char_filter": {
    7. "my_char_filter": {
    8. "type": "html_strip",
    9. "escaped_tags": [
    10. "a"
    11. ]
    12. }
    13. }
    14. }
    15. }
    16. }
    17. GET test_html_strip_filter/_analyze
    18. {
    19. "tokenizer": "standard",
    20. "char_filter": ["my_char_filter"],
    21. "text": ["

      I'm so happy!

      "
      ]
    22. }

    字符映射过滤器:Mapping Character Filter

    通过定义映替换为规则,把特定字符替换为指定字符

    "type": "mapping"   表示字符映射

    mappings 里面配置需要映射的字符关系

    1. PUT test_html_strip_filter
    2. {
    3. "settings": {
    4. "analysis": {
    5. "char_filter": {
    6. "my_char_filter": {
    7. "type": "mapping",
    8. "mappings": [
    9. "大 => *",
    10. "可 => *",
    11. "爱 => *"
    12. ]
    13. }
    14. }
    15. }
    16. }
    17. }
    18. GET test_html_strip_filter/_analyze
    19. {
    20. "char_filter": ["my_char_filter"],
    21. "text": "你就是一个大可爱"
    22. }

    正则替换过滤器:Pattern Replace Character Filter

    "type": "pattern_replace"   表示正则替换

    1. #正则替换
    2. PUT text_pattern_replace_filter
    3. {
    4. "settings": {
    5. "analysis": {
    6. "char_filter": {
    7. "my_char_filter": {
    8. "type": "pattern_replace",
    9. "pattern": """(\d{3})\d{4}(\d{4})""",
    10. "replacement": "$1****$2"
    11. }
    12. }
    13. }
    14. }
    15. }
    16. GET text_pattern_replace_filter/_analyze
    17. {
    18. "char_filter": ["my_char_filter"],
    19. "text": "您的手机号是18868686688"
    20. }

    感谢观看!!!感兴趣的小伙伴可以关注收藏,持续更新中!

  • 相关阅读:
    什么是泛型,什么是泛型约束
    自动化运维机器人(RPA)在银行IT运维领域应用场景分析
    快来带您了解中秋节的前世今生
    WPF .NET 7.0学习整理(一)
    C++ 动态库与静态库的区别?
    ElasticSearch入门笔记
    Java项目:ssm+jsp+mysql实现的垃圾分类查询管理系统
    Chapter4:Traing Model
    关于HTTP模块访问之后响应网页
    机器学习基础算法--回归类型和评价分析
  • 原文地址:https://blog.csdn.net/weixin_59367598/article/details/136587692