N-gram 分词过滤器

编辑

从一个词元中生成指定长度的 n-gram

例如,您可以使用 ngram 分词过滤器将 fox 转换为 [ f, fo, o, ox, x ]

此过滤器使用 Lucene 的 NGramTokenFilter

ngram 过滤器类似于 edge_ngram 分词过滤器。但是,edge_ngram 仅输出从词元开头开始的 n-gram。

示例

编辑

下面的 分析 API 请求使用 ngram 过滤器将 Quick fox 转换为 1 个字符和 2 个字符的 n-gram

resp = client.indices.analyze(
    tokenizer="standard",
    filter=[
        "ngram"
    ],
    text="Quick fox",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'standard',
    filter: [
      'ngram'
    ],
    text: 'Quick fox'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "standard",
  filter: ["ngram"],
  text: "Quick fox",
});
console.log(response);
GET _analyze
{
  "tokenizer": "standard",
  "filter": [ "ngram" ],
  "text": "Quick fox"
}

过滤器生成以下词元:

[ Q, Qu, u, ui, i, ic, c, ck, k, f, fo, o, ox, x ]

添加到分析器

编辑

下面的 创建索引 API 请求使用 ngram 过滤器来配置一个新的 自定义分析器

resp = client.indices.create(
    index="ngram_example",
    settings={
        "analysis": {
            "analyzer": {
                "standard_ngram": {
                    "tokenizer": "standard",
                    "filter": [
                        "ngram"
                    ]
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'ngram_example',
  body: {
    settings: {
      analysis: {
        analyzer: {
          standard_ngram: {
            tokenizer: 'standard',
            filter: [
              'ngram'
            ]
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "ngram_example",
  settings: {
    analysis: {
      analyzer: {
        standard_ngram: {
          tokenizer: "standard",
          filter: ["ngram"],
        },
      },
    },
  },
});
console.log(response);
PUT ngram_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "standard_ngram": {
          "tokenizer": "standard",
          "filter": [ "ngram" ]
        }
      }
    }
  }
}

可配置参数

编辑
max_gram
(可选,整数) gram 中字符的最大长度。默认为 2
min_gram
(可选,整数) gram 中字符的最小长度。默认为 1
preserve_original
(可选,布尔值) 当设置为 true 时,发出原始词元。默认为 false

您可以使用索引级别的设置 index.max_ngram_diff 来控制 max_grammin_gram 值之间允许的最大差值。

自定义

编辑

要自定义 ngram 过滤器,请复制它以创建新的自定义分词过滤器的基础。您可以使用其可配置参数修改过滤器。

例如,以下请求创建一个自定义 ngram 过滤器,该过滤器生成 3-5 个字符之间的 n-gram。此请求还将 index.max_ngram_diff 设置增加到 2

resp = client.indices.create(
    index="ngram_custom_example",
    settings={
        "index": {
            "max_ngram_diff": 2
        },
        "analysis": {
            "analyzer": {
                "default": {
                    "tokenizer": "whitespace",
                    "filter": [
                        "3_5_grams"
                    ]
                }
            },
            "filter": {
                "3_5_grams": {
                    "type": "ngram",
                    "min_gram": 3,
                    "max_gram": 5
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'ngram_custom_example',
  body: {
    settings: {
      index: {
        max_ngram_diff: 2
      },
      analysis: {
        analyzer: {
          default: {
            tokenizer: 'whitespace',
            filter: [
              '3_5_grams'
            ]
          }
        },
        filter: {
          "3_5_grams": {
            type: 'ngram',
            min_gram: 3,
            max_gram: 5
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "ngram_custom_example",
  settings: {
    index: {
      max_ngram_diff: 2,
    },
    analysis: {
      analyzer: {
        default: {
          tokenizer: "whitespace",
          filter: ["3_5_grams"],
        },
      },
      filter: {
        "3_5_grams": {
          type: "ngram",
          min_gram: 3,
          max_gram: 5,
        },
      },
    },
  },
});
console.log(response);
PUT ngram_custom_example
{
  "settings": {
    "index": {
      "max_ngram_diff": 2
    },
    "analysis": {
      "analyzer": {
        "default": {
          "tokenizer": "whitespace",
          "filter": [ "3_5_grams" ]
        }
      },
      "filter": {
        "3_5_grams": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 5
        }
      }
    }
  }
}