N-gram 分词器

编辑

ngram 分词器首先根据指定字符列表将文本分解成单词,然后发出指定长度的每个单词的 N-gram

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

示例输出

编辑

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

resp = client.indices.analyze(
    tokenizer="ngram",
    text="Quick Fox",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'ngram',
    text: 'Quick Fox'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "ngram",
  text: "Quick Fox",
});
console.log(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)。

resp = client.indices.create(
    index="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"
                    ]
                }
            }
        }
    },
)
print(resp)

resp1 = client.indices.analyze(
    index="my-index-000001",
    analyzer="my_analyzer",
    text="2 Quick Foxes.",
)
print(resp1)
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
const response = await client.indices.create({
  index: "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"],
        },
      },
    },
  },
});
console.log(response);

const response1 = await client.indices.analyze({
  index: "my-index-000001",
  analyzer: "my_analyzer",
  text: "2 Quick Foxes.",
});
console.log(response1);
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 ]