Shingle 标记过滤器编辑

通过连接相邻标记,将 shingles 或词语 n-grams 添加到标记流中。默认情况下,shingle 标记过滤器输出双词 shingles 和 unigrams。

例如,许多分词器将 the lazy dog 转换为 [ the, lazy, dog ]。您可以使用 shingle 过滤器将双词 shingles 添加到此流中:[ the, the lazy, lazy, lazy dog, dog ]

Shingles 通常用于帮助加快短语查询的速度,例如 match_phrase。我们建议您不要使用 shingles 过滤器创建 shingles,而是在相应的 文本 字段上使用 index-phrases 映射参数。

此过滤器使用 Lucene 的 ShingleFilter

示例编辑

以下 分析 API 请求使用 shingle 过滤器将双词 shingles 添加到 quick brown fox jumps 的标记流中

response = client.indices.analyze(
  body: {
    tokenizer: 'whitespace',
    filter: [
      'shingle'
    ],
    text: 'quick brown fox jumps'
  }
)
puts response
GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [ "shingle" ],
  "text": "quick brown fox jumps"
}

该过滤器生成以下标记

[ quick, quick brown, brown, brown fox, fox, fox jumps, jumps ]

要生成 2-3 个词的 shingles,请将以下参数添加到分析 API 请求中

  • min_shingle_size: 2
  • max_shingle_size: 3
response = client.indices.analyze(
  body: {
    tokenizer: 'whitespace',
    filter: [
      {
        type: 'shingle',
        min_shingle_size: 2,
        max_shingle_size: 3
      }
    ],
    text: 'quick brown fox jumps'
  }
)
puts response
GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "shingle",
      "min_shingle_size": 2,
      "max_shingle_size": 3
    }
  ],
  "text": "quick brown fox jumps"
}

该过滤器生成以下标记

[ quick, quick brown, quick brown fox, brown, brown fox, brown fox jumps, fox, fox jumps, jumps ]

要仅在输出中包含 shingles,请将 output_unigrams 参数添加到请求中,其值为 false

response = client.indices.analyze(
  body: {
    tokenizer: 'whitespace',
    filter: [
      {
        type: 'shingle',
        min_shingle_size: 2,
        max_shingle_size: 3,
        output_unigrams: false
      }
    ],
    text: 'quick brown fox jumps'
  }
)
puts response
GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "shingle",
      "min_shingle_size": 2,
      "max_shingle_size": 3,
      "output_unigrams": false
    }
  ],
  "text": "quick brown fox jumps"
}

该过滤器生成以下标记

[ quick brown, quick brown fox, brown fox, brown fox jumps, fox jumps ]

添加到分析器编辑

以下 创建索引 API 请求使用 shingle 过滤器配置新的 自定义分析器

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          standard_shingle: {
            tokenizer: 'standard',
            filter: [
              'shingle'
            ]
          }
        }
      }
    }
  }
)
puts response
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "standard_shingle": {
          "tokenizer": "standard",
          "filter": [ "shingle" ]
        }
      }
    }
  }
}

可配置参数编辑

max_shingle_size

(可选,整数)创建 shingles 时要连接的最大标记数。默认为 2

此值不能小于 min_shingle_size 参数,该参数默认为 2。此值与 min_shingle_size 参数之间的差值不能超过 index.max_shingle_diff 索引级设置,该设置默认为 3

min_shingle_size

(可选,整数)创建 shingles 时要连接的最小标记数。默认为 2

此值不能超过 max_shingle_size 参数,该参数默认为 2max_shingle_size 参数与此值之间的差值不能超过 index.max_shingle_diff 索引级设置,该设置默认为 3

output_unigrams
(可选,布尔值)如果为 true,则输出包含原始输入标记。如果为 false,则输出仅包含 shingles;原始输入标记将被删除。默认为 true
output_unigrams_if_no_shingles

如果为 true,则仅当未生成 shingles 时,输出才包含原始输入标记;如果生成了 shingles,则输出仅包含 shingles。默认为 false

如果此参数和 output_unigrams 参数均为 true,则仅使用 output_unigrams 参数。

token_separator
(可选,字符串)用于连接相邻标记以形成 shingle 的分隔符。默认为空格 (" ")。
filler_token

(可选,字符串)在 shingles 中用作不包含标记的空位置的替换字符串。此填充标记仅在 shingles 中使用,而不在原始 unigrams 中使用。默认为下划线 (_)。

某些标记过滤器(例如 stop 过滤器)在删除位置增量大于 1 的停用词时会创建空位置。

示例

在以下 分析 API 请求中,stop 过滤器从 fox jumps a lazy dog 中删除了停用词 a,从而创建了一个空位置。后续的 shingle 过滤器在 shingles 中将此空位置替换为加号 (+)。

response = client.indices.analyze(
  body: {
    tokenizer: 'whitespace',
    filter: [
      {
        type: 'stop',
        stopwords: [
          'a'
        ]
      },
      {
        type: 'shingle',
        filler_token: '+'
      }
    ],
    text: 'fox jumps a lazy dog'
  }
)
puts response
GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "stop",
      "stopwords": [ "a" ]
    },
    {
      "type": "shingle",
      "filler_token": "+"
    }
  ],
  "text": "fox jumps a lazy dog"
}

该过滤器生成以下标记

[ fox, fox jumps, jumps, jumps +, + lazy, lazy, lazy dog, dog ]

自定义编辑

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

例如,以下 创建索引 API 请求使用自定义 shingle 过滤器 my_shingle_filter 来配置新的 自定义分析器

my_shingle_filter 过滤器使用 min_shingle_size2max_shingle_size5,这意味着它会生成 2-5 个词的 shingles。该过滤器还包含一个 output_unigrams 参数,其值为 false,这意味着输出中仅包含 shingles。

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          en: {
            tokenizer: 'standard',
            filter: [
              'my_shingle_filter'
            ]
          }
        },
        filter: {
          my_shingle_filter: {
            type: 'shingle',
            min_shingle_size: 2,
            max_shingle_size: 5,
            output_unigrams: false
          }
        }
      }
    }
  }
)
puts response
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "en": {
          "tokenizer": "standard",
          "filter": [ "my_shingle_filter" ]
        }
      },
      "filter": {
        "my_shingle_filter": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 5,
          "output_unigrams": false
        }
      }
    }
  }
}