跳至主要內容

Elasticsearch 文本分析

钝悟...大约 9 分钟数据库搜索引擎数据库Elasticsearch数据库搜索引擎数据库Elasticsearch分词

Elasticsearch 文本分析

文本分析是将非结构化文本转换为针对搜索优化的结构化格式的过程。

文本分析简介

文本分析使 Elasticsearch 能够执行全文搜索,其中搜索返回所有相关结果,而不仅仅是完全匹配。

文本分析可以分为两个方面:

  • Tokenization(分词化) - 分析通过分词化使全文搜索成为可能:将文本分解成更小的块,称为分词。在大多数情况下,这些标记是单独的 term(词项)。
  • Normalizeation(标准化) - 经过分词后的文本只能进行词项匹配,但是无法进行同义词匹配。为解决这个问题,可以将文本进行标准化处理。例如:将 foxes 标准化为 fox

Analyzer(分析器)

文本分析由 analyzer(分析器)open in new window 执行,分析器是一组控制整个过程的规则。无论是索引还是搜索,都需要使用分析器。

analyzer(分析器)open in new window 由三个组件组成:零个或多个 Character Filters(字符过滤器)open in new window、有且仅有一个 Tokenizer(分词器)open in new window、零个或多个 Token Filters(分词过滤器)open in new window

它的执行顺序如下:

character filters -> tokenizer -> token filters

Elasticsearch 内置的分析器:

默认情况下,Elasticsearch 使用 standard analyzer(标准分析器)open in new window,它开箱即用,适用于大多数使用场景。Elasticsearch 也允许定制分析器。

测试分析器

_analyze APIopen in new window 是查看分析器如何分词的工具。

【示例】直接指定 analyzer 进行测试

查看不同的 analyzer 的效果

GET _analyze
{
  "analyzer": "standard",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

GET _analyze
{
  "analyzer": "simple",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

GET _analyze
{
  "analyzer": "stop",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

GET _analyze
{
  "analyzer": "whitespace",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

GET _analyze
{
  "analyzer": "keyword",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

GET _analyze
{
  "analyzer": "pattern",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
【示例】自由组合分析器组件进行测试
POST _analyze
{
  "tokenizer": "standard",
  "filter":  [ "lowercase", "asciifolding" ],
  "text":      "Is this déja vu?"
}

指定分析器

内置分析器可以直接使用,无需任何配置。但是,其中一些支持配置选项来更改其行为。

在搜索时,Elasticsearch 通过按顺序检查以下参数来确定要使用的分析器:

  1. 搜索查询中的 analyzeropen in new window 参数。请参阅 指定查询的搜索分析器open in new window
  2. 字段的 search_analyzeropen in new window 映射参数。请参阅 为字段指定搜索分析器open in new window
  3. analysis.analyzer.default_search 索引设置。请参阅 指定索引的默认搜索分析器open in new window
  4. 字段的 analyzeropen in new window mapping 参数。请参阅 为字段指定分析器open in new window

如果未指定这些参数,则使用 standardopen in new window 分析器。

【示例】设置索引的默认分析器

将 std_english 分析器定义为基于标准分析器,但配置为删除预定义的英语停用词列表

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "std_english": {
          "type":      "standard",
          "stopwords": "_english_"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_text": {
        "type":     "text",
        "analyzer": "standard",
        "fields": {
          "english": {
            "type":     "text",
            "analyzer": "std_english"
          }
        }
      }
    }
  }
}
【示例】设置字段的分析器

将字段 title 的分析器设为 whitespace

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "whitespace"
      }
    }
  }
}
【示例】指定查询的搜索分析器
GET my-index-000001/_search
{
  "query": {
    "match": {
      "message": {
        "query": "Quick foxes",
        "analyzer": "stop"
      }
    }
  }
}
【示例】指定字段的搜索分析器
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "whitespace",
        "search_analyzer": "simple"
      }
    }
  }
}
【示例】指定索引的默认搜索分析器

创建索引时,可以使用该 analysis.analyzer.default_search 设置设置默认搜索分析器。如果提供了搜索分析器,则还必须使用 analysis.analyzer.default 设置指定默认索引分析器。

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        },
        "default_search": {
          "type": "whitespace"
        }
      }
    }
  }
}

自定义分析器

自定义分析器,需要指定 type 为 custom 类型。

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}

中文分词

在英文中,单词有自然的空格作为分隔。

在中文中,分词有以下难点:

  • 中文不能根据一个个汉字进行分词
  • 不同于英文可以根据自然的空格进行分词;中文中一般不会有空格。
  • 同一句话,在不同的上下文中,有不同个理解。例如:这个苹果,不大好吃;这个苹果,不大,好吃!

可以使用一些插件来获得对中文更好的分析能力:

Character Filters(字符过滤器)

Character Filters(字符过滤器)open in new window 将原始文本作为字符流接收,并可以通过添加、删除或更改字符来转换文本。

分析器可以有零个或多个 Character Filters(字符过滤器)open in new window,如果配置了多个,它会按照配置的顺序执行。

Elasticsearch 内置的字符过滤器:

Tokenizer(分词器)

Tokenizer(分词器)open in new window 接收字符流,将其分解为分词(通常是单个单词),并输出一个分词流。

分词器还负责记录每个 term 的顺序或位置,以及该 term 所代表的原始单词的开始和结束字符偏移量。``

分析器有且仅有一个 Tokenizer(分词器)open in new window

Elasticsearch 内置的分词器:

Token Filters(分词过滤器)

Token Filters(分词过滤器)open in new window 接收分词流,并可以添加、删除或更改分词。常用的分词过滤器有: lowercase(小写转换)open in new windowstop(停用词处理)open in new windowsynonym(同义词处理)open in new window 等等。

分析器可以有零个或多个 Token Filters(分词过滤器)open in new window,如果配置了多个,它会按照配置的顺序执行。

Elasticsearch 内置了很多分词过滤器,这里列举几个常见的:

参考资料

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.7