Elasticsearch 分词器

一、简介

在 Elasticsearch 中,分词器(Analyzer) 是文本处理的核心组件,用于将文本拆分为词项(Terms),并对词项进行标准化处理。分词器在索引和搜索过程中起着至关重要的作用,直接影响搜索的准确性和性能。

二、分词器的组成

Elasticsearch 的分词器由以下三个部分组成:

  1. 字符过滤器(Character Filters):
    • 在分词之前对原始文本进行预处理。
    • 例如,去除 HTML 标签、替换特殊字符等。
  2. 分词器(Tokenizer):
    • 将文本拆分为单独的词项(Tokens)。
    • 例如,按空格分词、按标点符号分词等。
  3. 词项过滤器(Token Filters):
    • 对分词后的词项进行进一步处理。
    • 例如,小写转换、去除停用词、词干提取等。

三、分词器的工作流程

  1. 字符过滤:去除 HTML 标签。
    • 输入:Elasticsearch is powerful!

    • 输出:Elasticsearch is powerful!

  2. 分词:按单词边界分词。
    • 输出:["Elasticsearch", "is", "powerful"]
  3. 词项过滤:
    • 小写转换:["elasticsearch", "is", "powerful"]
    • 去除停用词:["elasticsearch", "powerful"]
    • 提取词干:["elasticsearch", "power"]

三、内置分词器

Elasticsearch 提供了多种内置分词器,适用于不同的场景。以下是常用的内置分词器:

  1. Standard Analyzer

    • 默认分词器:如果没有指定分词器,Elasticsearch 会使用 Standard Analyzer。
    • 组成:
      • 字符过滤器:无。
      • 分词器:standard。
      • 词项过滤器:lowercase。
    • 功能:
      • 按单词边界分词。
      • 转换为小写。
      • 去除标点符号。
    • 适用场景:通用文本分析。
    • 示例:
      • 输入:"Elasticsearch is powerful!"
      • 输出:["elasticsearch", "is", "powerful"]
  2. Simple Analyzer

    • 组成:
      • 字符过滤器:无。
      • 分词器:lowercase。
      • 词项过滤器:无。
    • 功能:
      • 按非字母字符分词。
      • 转换为小写。
    • 适用场景:简单的文本分析。
    • 示例:
      • 输入:"Elasticsearch is powerful!"
      • 输出:["elasticsearch", "is", "powerful"]
  3. Whitespace Analyzer

    • 组成:
      • 字符过滤器:无。
      • 分词器:whitespace。
      • 词项过滤器:无。
    • 功能:
      • 按空格分词。
      • 不进行小写转换或其他处理。
    • 适用场景:需要保留原始大小写和标点符号的文本分析。
    • 示例:
      • 输入:"Elasticsearch is powerful!"
      • 输出:["Elasticsearch", "is", "powerful!"]
  4. Keyword Analyzer

    • 组成:
      • 字符过滤器:无。
      • 分词器:keyword。
      • 词项过滤器:无。
    • 功能:
      • 将整个文本作为一个词项。
      • 不进行分词或处理。
    • 适用场景:需要精确匹配的字段(如 ID、标签)。
    • 示例:
      • 输入:"Elasticsearch is powerful!"
      • 输出:["Elasticsearch is powerful!"]
  5. Pattern Analyzer

    • 组成:
      • 字符过滤器:无。
      • 分词器:pattern。
      • 词项过滤器:lowercase(可选)。
    • 功能:
      • 使用正则表达式分词。
      • 可以自定义正则表达式。
    • 适用场景:需要自定义分词规则的文本分析。
    • 示例:
      • 输入:"Elasticsearch-is-powerful!"
      • 输出:["elasticsearch", "is", "powerful"]
  6. Language Analyzers

    • 组成:
      • 字符过滤器:无。
      • 分词器:standard。
      • 词项过滤器:语言特定的过滤器(如停用词、词干提取)。
    • 功能:
      • 针对特定语言的分词器。
      • 支持多种语言(如英语、中文、法语等)。
    • 适用场景:多语言文本分析。
    • 示例:
      • 输入:"Elasticsearch is powerful!"
      • 输出:["elasticsearch", "powerful"](去除了停用词 "is")
  7. Stop Analyzer

    • 组成:
      • 字符过滤器:无。
      • 分词器:lowercase。
      • 词项过滤器:stop。
    • 功能:
      • 按非字母字符分词。
      • 转换为小写。
      • 去除停用词。
    • 适用场景:需要去除停用词的文本分析。
    • 示例:
      • 输入:"Elasticsearch is powerful!"
      • 输出:["elasticsearch", "powerful"]
  8. Fingerprint Analyzer

    • 组成:
      • 字符过滤器:无。
      • 分词器:standard。
      • 词项过滤器:lowercase, stop, fingerprint。
    • 功能:
      • 将文本转换为唯一的指纹。
      • 去除重复词项和停用词。
    • 适用场景:去重和标准化文本。
    • 示例:
      • 输入:"Elasticsearch is powerful and Elasticsearch is fast!"
      • 输出:["and", "elasticsearch", "fast", "is", "powerful"]

四、IK 分词器

在 Elasticsearch 中,IK 分词器(IK Analyzer) 是一个专门为中文文本设计的分词插件。它支持两种分词模式:智能模式(ik_smart) 和 最大分词模式(ik_max_word),能够高效地处理中文分词需求。

4.1 IK 分词器的特点
  • 中文优化:专门为中文文本设计,支持中文分词。
  • 两种分词模式:
    • ik_smart:智能模式,尽可能组合词语,输出最少的词项。
    • ik_max_word:最大分词模式,将文本切分为最细粒度的词项。
  • 扩展词典支持:支持用户自定义词典,适应特定领域的分词需求。
  • 高性能:基于字典的分词算法,分词速度快。
4.2 IK 分词器的安装

IK 分词器是一个第三方插件,需要手动安装到 Elasticsearch 中。

  1. 安装步骤

  2. 将插件包解压到 Elasticsearch 的 plugins 目录下。

    bash 复制代码
    unzip elasticsearch-analysis-ik-{version}.zip -d /path/to/elasticsearch/plugins/ik
  3. 重启 Elasticsearch。

4.3 IK 分词器的配置

IK 分词器安装后,可以直接在索引设置或字段映射中使用。

  1. 在索引设置中配置 IK 分词器

    bash 复制代码
    PUT /my_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "ik_smart_analyzer": {
              "type": "custom",
             "tokenizer": "ik_smart"
            },
            "ik_max_word_analyzer": {
              "type": "custom",
              "tokenizer": "ik_max_word"
            }
          }
        }
      }
    }
  2. 在字段映射中指定 IK 分词器

    bash 复制代码
    PUT /my_index/_mapping
    {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "ik_smart_analyzer"
        },
        "content": {
          "type": "text",
          "analyzer": "ik_max_word_analyzer"
        }
      }
    }
4.4 IK 分词器的使用

IK 分词器可以在索引和搜索时使用。

  1. 索引时分词

    • 在索引文档时,IK 分词器会对文本字段进行分词。

      bash 复制代码
      POST /my_index/_doc/1
      {
        "title": " Elasticsearch 是一个搜索引擎",
        "content": "IK 分词器非常好用"
      }
  2. 搜索时分词

    • 在搜索时,IK 分词器会对查询字符串进行分词。

      bash 复制代码
      POST /my_index/_search
      {
        "query": {
          "match": {
            "content": "分词器"
          }
        }
      }
4.5 IK 分词器的测试

可以使用 _analyze API 测试 IK 分词器的效果。

  1. 测试 ik_smart 模式

    bash 复制代码
    POST /my_index/_analyze
    {
      "analyzer": "ik_smart",
      "text": "Elasticsearch 是一个搜索引擎"
    }
    • 结果:
      • 输入:"Elasticsearch 是一个搜索引擎"
      • 输出:["Elasticsearch", "是", "一个", "搜索引擎"]
  2. 测试 ik_max_word 模式

    bash 复制代码
    POST /my_index/_analyze
    {
      "analyzer": "ik_max_word",
      "text": "Elasticsearch 是一个搜索引擎"
    }
    • 结果:
      • 输入:"Elasticsearch 是一个搜索引擎"
      • 输出:["Elasticsearch", "是", "一个", "搜索", "搜索引擎", "索引", "引擎"]
4.6 扩展词典

IK 分词器支持用户自定义词典,以适应特定领域的分词需求。

  1. 扩展词典的配置

    • 在 config/analysis-ik/ 目录下创建自定义词典文件(如 my_dict.dic)。

    • 在 IKAnalyzer.cfg.xml 中配置自定义词典:

      bash 复制代码
      <properties>
          <comment>IK Analyzer 扩展配置</comment>
          <entry key="ext_dict">my_dict.dic</entry>
      </properties>
    • 重启 Elasticsearch。

  2. 自定义词典示例

    • 词典内容:

      bash 复制代码
      搜索引擎
      非常好用
    • 测试结果:

      • 输入:"Elasticsearch 是一个搜索引擎"
      • 输出:["Elasticsearch", "是", "一个", "搜索引擎"]
4.7 停用词配置

IK 分词器支持配置停用词,以去除无意义的词项。

  1. 停用词配置

    • 在 config/analysis-ik/ 目录下创建停用词文件(如 stopwords.dic)。

    • 在 IKAnalyzer.cfg.xml 中配置停用词:

      bash 复制代码
      <properties>
          <comment>IK Analyzer 扩展配置</comment>
          <entry key="ext_stopwords">stopwords.dic</entry>
      </properties>
    • 重启 Elasticsearch。

  2. 停用词示例

    bash 复制代码
    是
    一个
    • 测试结果:
      • 输入:"Elasticsearch 是一个搜索引擎"
      • 输出:["Elasticsearch", "搜索引擎"]

五、分词器的配置

分词器可以在以下位置配置:

  1. 索引设置(Index Settings):

    • 在创建索引时定义分词器。

      bash 复制代码
      PUT /my_index
      {
        "settings": {
          "analysis": {
            "char_filter": {
             "my_char_filter": {
                "type": "mapping",
                "mappings": ["& => and"]
              }
            },
            "filter": {
              "my_stopwords": {
                "type": "stop",
                "stopwords": ["is", "the"]
              },
              "my_synonyms": {
                "type": "synonym",
                "synonyms": ["quick, fast"]
              }
            },
            "analyzer": {
              "my_custom_analyzer": {
                "type": "custom",
               "char_filter": ["html_strip", "my_char_filter"],
               "tokenizer": "standard",
                "filter": ["lowercase", "my_stopwords", "my_synonyms", "stemmer"]
             }
            }
          }
        }
      }
    • 配置说明

      • char_filter:定义字符过滤器。
        • my_char_filter:将 & 替换为 and。
      • filter:定义词项过滤器。
        • my_stopwords:去除停用词 is 和 the。
        • my_synonyms:将 quick 和 fast 视为同义词。
      • analyzer:定义自定义分词器。
        • my_custom_analyzer:组合字符过滤器、分词器和词项过滤器。
  2. 字段映射(Field Mapping):

    • 为特定字段指定分词器。

      bash 复制代码
      PUT /my_index/_mapping
      {
        "properties": {
          "title": {
            "type": "text",
            "analyzer": "my_custom_analyzer"
          }
        }
      }
    • 配置说明

      • title 字段:使用自定义分词器 my_custom_analyzer。
  3. 搜索请求(Search Request):

    • 在搜索时指定分词器。

      bash 复制代码
      POST /my_index/_search
      {
        "query": {
          "match": {
            "title": {
              "query": "Elasticsearch",
              "analyzer": "my_custom_analyzer"
            }
          }
        }
      }
    • 配置说明

      • match 查询:使用自定义分词器 my_custom_analyzer 分析查询字符串。

六、自定义分词器

如果内置分词器不能满足需求,可以通过组合字符过滤器、分词器和词项过滤器来自定义分词器,以实现更灵活的文本分析。

6.1 自定义分词器的配置

自定义分词器可以在索引设置中配置。以下是一个自定义分词器的配置示例:

bash 复制代码
PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "char_filter": ["html_strip"],
          "tokenizer": "standard",
          "filter": ["lowercase", "stop", "stemmer"]
        }
      }
    }
  }
}

配置说明

  • type:指定分词器类型为 custom。
  • char_filter:指定字符过滤器(如 html_strip)。
  • tokenizer:指定分词器(如 standard)。
  • filter:指定词项过滤器(如 lowercase, stop, stemmer)。
6.2 自定义分词器的使用

自定义分词器可以在索引映射或搜索请求中使用。

  1. 在索引映射中使用

    • 在创建索引时,为特定字段指定自定义分词器:

      bash 复制代码
      PUT /my_index/_mapping
      {
        "properties": {
          "title": {
            "type": "text",
            "analyzer": "my_custom_analyzer"
          }
        }
      }
  2. 在搜索请求中使用

    • 在搜索时,指定自定义分词器:

      bash 复制代码
      POST /my_index/_search
      {
        "query": {
          "match": {
            "title": {
              "query": "Elasticsearch",
              "analyzer": "my_custom_analyzer"
            }
          }
        }
      }
6.3 自定义分词器的测试

可以使用 _analyze API 测试自定义分词器的效果:

bash 复制代码
POST /my_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text": "Elasticsearch is <b>powerful</b>!"
}

测试结果:

  • 输入:"Elasticsearch is powerful!"
  • 输出:["elasticsearch", "power"]

七、常用字符过滤器、分词器、词项过滤器

  1. 常用字符过滤器

    • HTML Strip Char Filter:去除 HTML 标签。
      • 示例:Elasticsearch

        → Elasticsearch

    • Mapping Char Filter:替换特定字符。
      • 示例:将 & 替换为 and。
    • Pattern Replace Char Filter:使用正则表达式替换字符。
      • 示例:将 - 替换为空格。
  2. 常用分词器

    • Standard Tokenizer:按单词边界分词。
      • 示例:"Elasticsearch is powerful!" → ["Elasticsearch", "is", "powerful"]
    • Whitespace Tokenizer:按空格分词。
      • 示例:"Elasticsearch is powerful!" → ["Elasticsearch", "is", "powerful!"]
    • Keyword Tokenizer:将整个文本作为一个词项。
      • 示例:"Elasticsearch is powerful!" → ["Elasticsearch is powerful!"]
    • Pattern Tokenizer:使用正则表达式分词。
      -示例:按 - 分词:"Elasticsearch-is-powerful" → ["Elasticsearch", "is", "powerful"]
  3. 常用词项过滤器

    • Lowercase Token Filter:将词项转换为小写。
      • 示例:"Elasticsearch" → "elasticsearch"
    • Stop Token Filter:去除停用词(如 "is"、"the")。
      • 示例:"Elasticsearch is powerful" → ["Elasticsearch", "powerful"]
    • Stemmer Token Filter:提取词干。
      • 示例:"running" → "run"
    • Synonym Token Filter:处理同义词。
      • 示例:"quick" → ["quick", "fast"]
相关推荐
StarRocks_labs5 小时前
从InfluxDB到StarRocks:Grab实现Spark监控平台10倍性能提升
大数据·数据库·starrocks·分布式·spark·iris·物化视图
若兰幽竹6 小时前
【Spark分析HBase数据】Spark读取并分析HBase数据
大数据·spark·hbase
R²AIN SUITE6 小时前
金融合规革命:R²AIN SUITE 如何重塑银行业务智能
大数据·人工智能
绿算技术7 小时前
“强强联手,智启未来”凯创未来与绿算技术共筑高端智能家居及智能照明领域新生态
大数据·人工智能·智能家居
只因只因爆8 小时前
spark的缓存
大数据·缓存·spark
Leo.yuan9 小时前
3D 数据可视化系统是什么?具体应用在哪方面?
大数据·数据库·3d·信息可视化·数据分析
只因只因爆10 小时前
spark小任务
大数据·分布式·spark
cainiao08060510 小时前
Java 大视界——Java 大数据在智慧交通智能停车诱导系统中的数据融合与实时更新
java·大数据·开发语言
End92813 小时前
Spark之搭建Yarn模式
大数据·分布式·spark
我爱写代码?13 小时前
Spark 集群配置、启动与监控指南
大数据·开发语言·jvm·spark·mapreduce