Link Search Menu Expand Document Documentation Menu

Edge n-gram 分词器

The edge_ngram 分词器从每个单词的开头生成部分词元(即 n-gram)。它根据指定字符分割文本,并在定义的最小和最大长度范围内生成词元。此分词器对于实现即时搜索功能特别有用。

Edge n-gram 非常适合单词顺序可能变化的自动完成搜索,例如搜索产品名称或地址时。有关更多信息,请参阅自动完成。然而,对于顺序固定的文本,如电影或歌曲标题,Completion Suggester 可能会更准确。

默认情况下,edge n-gram 分词器生成的词元最小长度为 1,最大长度为 2。例如,在分析文本 OpenSearch 时,默认配置将生成 OOp n-gram。这些短 n-gram 通常会匹配到太多不相关的术语,因此需要配置分词器来调整 n-gram 长度。

使用示例

以下示例请求创建一个名为 my_index 的新索引,并配置一个使用 edge_ngram 分词器的分析器。此分词器生成长度为 3–6 个字符的词元,其中字母和符号都被视为有效词元字符

PUT /edge_n_gram_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "tokenizer": "my_custom_tokenizer"
        }
      },
      "tokenizer": {
        "my_custom_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 3,
          "max_gram": 6,
          "token_chars": [
            "letter"          ]
        }
      }
    }
  }
}

生成的词元

使用以下请求检查使用该分析器生成的词元

POST /edge_n_gram_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text": "Code 42 rocks!"
}

响应包含生成的词元

{
  "tokens": [
    {
      "token": "Cod",
      "start_offset": 0,
      "end_offset": 3,
      "type": "word",
      "position": 0
    },
    {
      "token": "Code",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 1
    },
    {
      "token": "roc",
      "start_offset": 8,
      "end_offset": 11,
      "type": "word",
      "position": 2
    },
    {
      "token": "rock",
      "start_offset": 8,
      "end_offset": 12,
      "type": "word",
      "position": 3
    },
    {
      "token": "rocks",
      "start_offset": 8,
      "end_offset": 13,
      "type": "word",
      "position": 4
    }
  ]
}

参数

参数 必需/可选 数据类型 描述
min_gram 可选 整数 最小词元长度。默认值为 1
max_gram 可选 整数 最大词元长度。默认值为 2
custom_token_chars 可选 字符串 定义要作为词元一部分处理的自定义字符(例如,+-_)。
token_chars 可选 字符串数组 定义要包含在词元中的字符类。词元会根据不属于这些类的字符进行分割。默认包含所有字符。可用类包括
- letter: 字母字符(例如,aç
- digit: 数字字符(例如,37
- punctuation: 标点符号(例如,!?
- symbol: 其他符号(例如,$
- whitespace: 空格或换行符
- custom: 允许您在 custom_token_chars 设置中指定自定义字符。

max_gram 参数限制

max_gram 参数设置分词器生成的词元的最大长度。当搜索查询超出此长度时,可能无法匹配索引中的任何术语。

例如,如果 max_gram 设置为 4,查询 explore 在索引时将被分词为 expl。因此,搜索完整术语 explore 将不会匹配索引中的词元 expl

为了解决此限制,您可以应用 truncate 词元过滤器将搜索术语缩短到最大词元长度。然而,这种方法存在权衡。将 explore 截断为 expl 可能会导致匹配到不相关的术语,例如 explosionexplicit,从而降低搜索精度。

我们建议仔细平衡 max_gram 值,以确保高效分词,同时最大限度地减少不相关的匹配。如果精度至关重要,请考虑其他策略,例如调整查询分析器或微调过滤器。

最佳实践

我们建议仅在索引时使用 edge_ngram 分词器,以确保存储部分词元。在搜索时,应使用基本分析器来匹配所有查询术语。

配置即时搜索功能

要实现即时搜索功能,请在索引期间使用 edge_ngram 分词器,并在搜索时使用执行最小处理的分析器。以下示例演示了这种方法。

使用 edge_ngram 分词器创建索引

PUT /my-autocomplete-index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "tokenizer": "autocomplete",
          "filter": [
            "lowercase"
          ]
        },
        "autocomplete_search": {
          "tokenizer": "lowercase"
        }
      },
      "tokenizer": {
        "autocomplete": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 10,
          "token_chars": [
            "letter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "autocomplete",
        "search_analyzer": "autocomplete_search"
      }
    }
  }
}

索引包含 product 字段的文档并刷新索引

PUT my-autocomplete-index/_doc/1?refresh
{
  "title": "Laptop Pro"
}

此配置确保 edge_ngram 分词器将“Laptop”等术语分解为 LaLapLapt 等词元,从而允许在搜索期间进行部分匹配。在搜索时,standard 分词器简化查询,同时由于小写过滤器,确保匹配不区分大小写。

现在搜索 laptop Prlap pr 将根据部分匹配检索相关文档

GET my-autocomplete-index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "lap pr",
        "operator": "and"
      }
    }
  }
}

有关更多信息,请参阅即时搜索

剩余 350 字符

有问题?

想要贡献?