分隔符有效载荷令牌过滤器编辑

旧名称 delimited_payload_filter 已弃用,不应与新索引一起使用。请改用 delimited_payload

根据指定的分隔符将令牌流分成令牌和有效载荷。

例如,您可以使用 delimited_payload 过滤器和 | 分隔符将 the|1 quick|2 fox|3 分割成令牌 thequickfox,其相应的有效载荷分别为 123

此过滤器使用 Lucene 的 DelimitedPayloadTokenFilter

有效载荷

有效载荷是与令牌位置关联的用户定义二进制数据,并以 base64 编码的字节存储。

Elasticsearch 默认情况下不存储令牌有效载荷。要存储有效载荷,您必须

  • term_vector 映射参数设置为 with_positions_payloadswith_positions_offsets_payloads,用于存储有效载荷的任何字段。
  • 使用包含 delimited_payload 过滤器的索引分析器

您可以使用 术语向量 API 查看存储的有效载荷。

示例编辑

以下 分析 API 请求使用 delimited_payload 过滤器和默认的 | 分隔符将 the|0 brown|10 fox|5 is|0 quick|10 分割成令牌和有效载荷。

response = client.indices.analyze(
  body: {
    tokenizer: 'whitespace',
    filter: [
      'delimited_payload'
    ],
    text: 'the|0 brown|10 fox|5 is|0 quick|10'
  }
)
puts response
GET _analyze
{
  "tokenizer": "whitespace",
  "filter": ["delimited_payload"],
  "text": "the|0 brown|10 fox|5 is|0 quick|10"
}

过滤器生成以下令牌

[ the, brown, fox, is, quick ]

请注意,分析 API 不会返回存储的有效载荷。有关包含返回有效载荷的示例,请参阅 返回存储的有效载荷

添加到分析器编辑

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

response = client.indices.create(
  index: 'delimited_payload',
  body: {
    settings: {
      analysis: {
        analyzer: {
          whitespace_delimited_payload: {
            tokenizer: 'whitespace',
            filter: [
              'delimited_payload'
            ]
          }
        }
      }
    }
  }
)
puts response
PUT delimited_payload
{
  "settings": {
    "analysis": {
      "analyzer": {
        "whitespace_delimited_payload": {
          "tokenizer": "whitespace",
          "filter": [ "delimited_payload" ]
        }
      }
    }
  }
}

可配置参数编辑

分隔符
(可选,字符串) 用于将令牌与有效载荷分隔的字符。默认为 |
编码

(可选,字符串) 存储有效载荷的数据类型。有效值为

浮点型
(默认) 浮点型
标识
字符
整数
整数

自定义并添加到分析器编辑

要自定义 delimited_payload 过滤器,请将其复制以创建新自定义令牌过滤器的基础。您可以使用其可配置参数修改过滤器。

例如,以下 创建索引 API 请求使用自定义 delimited_payload 过滤器来配置新的 自定义分析器。自定义 delimited_payload 过滤器使用 + 分隔符将令牌与有效载荷分隔。有效载荷编码为整数。

response = client.indices.create(
  index: 'delimited_payload_example',
  body: {
    settings: {
      analysis: {
        analyzer: {
          whitespace_plus_delimited: {
            tokenizer: 'whitespace',
            filter: [
              'plus_delimited'
            ]
          }
        },
        filter: {
          plus_delimited: {
            type: 'delimited_payload',
            delimiter: '+',
            encoding: 'int'
          }
        }
      }
    }
  }
)
puts response
PUT delimited_payload_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "whitespace_plus_delimited": {
          "tokenizer": "whitespace",
          "filter": [ "plus_delimited" ]
        }
      },
      "filter": {
        "plus_delimited": {
          "type": "delimited_payload",
          "delimiter": "+",
          "encoding": "int"
        }
      }
    }
  }
}

返回存储的有效载荷编辑

使用 创建索引 API 创建一个索引,该索引

  • 包含存储带有有效载荷的术语向量的字段。
  • 使用带有 delimited_payload 过滤器的 自定义索引分析器
response = client.indices.create(
  index: 'text_payloads',
  body: {
    mappings: {
      properties: {
        text: {
          type: 'text',
          term_vector: 'with_positions_payloads',
          analyzer: 'payload_delimiter'
        }
      }
    },
    settings: {
      analysis: {
        analyzer: {
          payload_delimiter: {
            tokenizer: 'whitespace',
            filter: [
              'delimited_payload'
            ]
          }
        }
      }
    }
  }
)
puts response
PUT text_payloads
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "term_vector": "with_positions_payloads",
        "analyzer": "payload_delimiter"
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "payload_delimiter": {
          "tokenizer": "whitespace",
          "filter": [ "delimited_payload" ]
        }
      }
    }
  }
}

向索引添加包含有效载荷的文档。

response = client.index(
  index: 'text_payloads',
  id: 1,
  body: {
    text: 'the|0 brown|3 fox|4 is|0 quick|10'
  }
)
puts response
POST text_payloads/_doc/1
{
  "text": "the|0 brown|3 fox|4 is|0 quick|10"
}

使用 术语向量 API 返回文档的令牌和 base64 编码的有效载荷。

response = client.termvectors(
  index: 'text_payloads',
  id: 1,
  body: {
    fields: [
      'text'
    ],
    payloads: true
  }
)
puts response
GET text_payloads/_termvectors/1
{
  "fields": [ "text" ],
  "payloads": true
}

API 返回以下响应

{
  "_index": "text_payloads",
  "_id": "1",
  "_version": 1,
  "found": true,
  "took": 8,
  "term_vectors": {
    "text": {
      "field_statistics": {
        "sum_doc_freq": 5,
        "doc_count": 1,
        "sum_ttf": 5
      },
      "terms": {
        "brown": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 1,
              "payload": "QEAAAA=="
            }
          ]
        },
        "fox": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 2,
              "payload": "QIAAAA=="
            }
          ]
        },
        "is": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 3,
              "payload": "AAAAAA=="
            }
          ]
        },
        "quick": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 4,
              "payload": "QSAAAA=="
            }
          ]
        },
        "the": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 0,
              "payload": "AAAAAA=="
            }
          ]
        }
      }
    }
  }
}