Link Search Menu Expand Document Documentation Menu

N-gram 分词器

ngram 分词器将文本分割成指定长度的重叠 N-gram(字符序列)。当您想要执行部分单词匹配或自动完成搜索功能时,此分词器特别有用,因为它会生成原始输入文本的子字符串(字符 N-gram)。

使用示例

以下示例请求创建了一个名为 my_index 的新索引,并配置了一个带有 ngram 分词器的分析器。

PUT /my_index
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 4,
          "token_chars": ["letter", "digit"]
        }
      },
      "analyzer": {
        "my_ngram_analyzer": {
          "type": "custom",
          "tokenizer": "my_ngram_tokenizer"
        }
      }
    }
  }
}

生成的词元

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

POST /my_index/_analyze
{
  "analyzer": "my_ngram_analyzer",
  "text": "OpenSearch"
}

响应包含生成的词元

{
  "tokens": [
    {"token": "Sea","start_offset": 0,"end_offset": 3,"type": "word","position": 0},
    {"token": "Sear","start_offset": 0,"end_offset": 4,"type": "word","position": 1},
    {"token": "ear","start_offset": 1,"end_offset": 4,"type": "word","position": 2},
    {"token": "earc","start_offset": 1,"end_offset": 5,"type": "word","position": 3},
    {"token": "arc","start_offset": 2,"end_offset": 5,"type": "word","position": 4},
    {"token": "arch","start_offset": 2,"end_offset": 6,"type": "word","position": 5},
    {"token": "rch","start_offset": 3,"end_offset": 6,"type": "word","position": 6}
  ]
}

参数

ngram 分词器可以使用以下参数进行配置。

参数 必需/可选 数据类型 描述
min_gram 可选 整数 N-gram 的最小长度。默认为 1
max_gram 可选 整数 N-gram 的最大长度。默认为 2
token_chars 可选 字符串列表 要包含在分词中的字符类别。有效值包括:
- letter(字母)
- digit(数字)
- whitespace(空格)
- punctuation(标点符号)
- symbol(符号)
- custom(您还必须指定 custom_token_chars 参数)
默认为空列表 ([]),表示保留所有字符。
custom_token_chars 可选 字符串 要包含在词元中的自定义字符。

min_grammax_gram 之间的最大差值

min_grammax_gram 之间的最大差值通过索引级别设置 index.max_ngram_diff 配置,默认为 1

以下示例请求创建了一个带有自定义 index.max_ngram_diff 设置的索引。

PUT /my-index
{
  "settings": {
    "index.max_ngram_diff": 2, 
    "analysis": {
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 5,
          "token_chars": ["letter", "digit"]
        }
      },
      "analyzer": {
        "my_ngram_analyzer": {
          "type": "custom",
          "tokenizer": "my_ngram_tokenizer"
        }
      }
    }
  }
}

剩余 350 字符

有问题?

想贡献吗?