NGram Tokenizer

ngram tokenizer 遇到指定的字符(如 : 空白、标点)时分割文本,然后返回指定长度的每个单词的 N-grams

N-grams 就像一个滑动窗口在单词上移动,是一个连续的指定长度的字符序列。 通常用于查询不使用空格或具有较长复合词(如德语)的语言。

输出示例

使用默认设置,ngram tokenizer将初始文本视为单个词元,并生成最小长度为1且最大长度为2的 N-gram:

POST _analyze
{
  "tokenizer": "ngram",
  "text": "Quick Fox"
}

上面的句子会生成如下的词元:

[ Q, Qu, u, ui, i, ic, c, ck, k, "k ", " ", " F", F, Fo, o, ox, x ]

配置

min_gram

以 gram 为单位的最小字符长度。 默认为1。

max_gram

以 gram 为单位的最大字符长度。 默认为2。

token_chars

应包含在词元中的字符类。 Elasticsearch将分割不属于指定类的字符。 默认为[](保留所有字符)。字符类可能是以下任何一种: 单词 - 例如a,b,ï或京 数字 - 例如3或7 空格 - 例如“”或“ n” 标点符号 - 例如! 要么 ” 符号 - 例如$或√

提示:

通常,将min_grammax_gram设为同样的值。值越小,匹配到的文档越多,但是匹配的质量越差。值越大,越能匹配到指定的文档。3 是一个不错的初始值。

配置示例

下面的例子中,我们配置 ngram tokenizer处理单词和数字,生成 tri-grams (grams 为 3):

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "2 Quick Foxes."
}

输出为:

[ Qui, uic, ick, Fox, oxe, xes ]

Last updated