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 ]

配置

ngram tokenizer 接受以下参数:

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

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

_token_chars   _应包含在词元中的字符类。 Elasticsearch将分割不属于指定类的字符。 默认为[](保留所有字符)。

字符类可能是以下任何一种:

  • 单词  - 例如a,b,ï或京
  • 数字  - 例如3或7
  • 空格  - 例如“”或“\ n”
  • 标点符号  - 例如! 要么 ”
  • 符号  - 例如$或√

提示

It usually makes sense to set min_gram and max_gram to the same value. The smaller the length, the more documents will match but the lower the quality of the matches. The longer the length, the more specific the matches. A tri-gram (length 3) is a good place to start.

通常,将 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 ]