N-gram 分词器编辑

ngram 分词器首先在遇到指定字符列表中的任何一个字符时将文本分解为单词,然后为指定长度的每个单词生成 N-gram

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

示例输出编辑

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

response = client.indices.analyze(
  body: {
    tokenizer: 'ngram',
    text: 'Quick Fox'
  }
)
puts response
POST _analyze
{
  "tokenizer": "ngram",
  "text": "Quick Fox"
}

上面的句子将生成以下词条

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

配置编辑

ngram 分词器接受以下参数

min_gram

gram 中的最小字符长度。默认为 1

max_gram

gram 中的最大字符长度。默认为 2

token_chars

应包含在标记中的字符类。Elasticsearch 将根据不属于指定类的字符进行拆分。默认为 [](保留所有字符)。

字符类可以是以下任意一种

  • letter - 例如 abï
  • digit - 例如 37
  • whitespace - 例如 " ""\n"
  • punctuation - 例如 !"
  • symbol - 例如 $
  • custom - 需要使用 custom_token_chars 设置设置的自定义字符。

custom_token_chars

应被视为标记一部分的自定义字符。例如,将其设置为 +-_ 将使分词器将加号、减号和下划线视为标记的一部分。

通常,将 min_grammax_gram 设置为相同的值是有意义的。长度越小,匹配的文档越多,但匹配的质量越低。长度越长,匹配越具体。三元组(长度 3)是一个不错的起点。

索引级别设置 index.max_ngram_diff 控制 max_grammin_gram 之间允许的最大差值。

示例配置编辑

在此示例中,我们将 ngram 分词器配置为将字母和数字视为标记,并生成三元组(长度为 3 的 gram)

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_analyzer: {
            tokenizer: 'my_tokenizer'
          }
        },
        tokenizer: {
          my_tokenizer: {
            type: 'ngram',
            min_gram: 3,
            max_gram: 3,
            token_chars: [
              'letter',
              'digit'
            ]
          }
        }
      }
    }
  }
)
puts response

response = client.indices.analyze(
  index: 'my-index-000001',
  body: {
    analyzer: 'my_analyzer',
    text: '2 Quick Foxes.'
  }
)
puts response
PUT my-index-000001
{
  "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-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "2 Quick Foxes."
}

上面的示例生成以下词条

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