分隔式负载分词过滤器

分隔式负载分词过滤器 #

分隔式负载(delimited_payload)分词过滤器用于在分词过程中解析包含负载的词元。例如,字符串 red|1.5 fast|2.0 car|1.0 会被解析为词元 red(负载为 1.5)、fast(负载为 2.0)和 car(负载为 1.0)。当你的词元包含额外的关联数据(如权重、分数或其他数值),且你打算将这些数据用于评分或自定义查询逻辑时,这个过滤器就特别有用。该过滤器可以处理不同类型的负载,包括整数、浮点数和字符串,并将负载(额外的元数据)附加到词元上。

在文本分词时,分隔式负载分词过滤器会解析每个词元,提取负载并将其附加到词元上。后续在查询中可以使用这个负载来影响评分、提升权重或实现其他自定义行为。

负载以 Base64 编码的字符串形式存储。默认情况下,负载不会随词元一起在查询响应中返回。若要返回负载,你必须配置额外的参数。更多信息,请参阅“带有负载存储的分词示例”。

参数说明 #

分隔式负载分词过滤器有两个参数:

参数必需/可选数据类型描述
encoding可选字符串指定附加到词元的负载的数据类型。这决定了在分析和查询期间如何解释负载数据。
有效值为:
- float:使用 IEEE 754 格式将负载解释为 32 位浮点数(例如,car\|2.5 中的 2.5)。
- identity:将负载解释为字符序列(例如,在 user\|admin 中,admin 被解释为字符串)。
- int:将负载解释为 32 位整数(例如,priority \| 1中的1)。
默认值为 float
delimiter可选字符串指定在输入文本中分隔词元及其负载的字符。默认值为竖线字符(\|)。

不带负载存储的分词示例 #

以下示例请求创建了一个名为 my_index 的新索引,并配置了一个带有分隔式负载过滤器的分词器:

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "my_payload_filter": {
          "type": "delimited_payload",
          "delimiter": "|",
          "encoding": "float"
        }
      },
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": ["my_payload_filter"]
        }
      }
    }
  }
}

产生的词元 #

使用以下请求来检查使用该分词器生成的词元:

POST /my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "red|1.5 fast|2.0 car|1.0"
}

返回内容包含产生的词元

{
  "tokens": [
    {
      "token": "red",
      "start_offset": 0,
      "end_offset": 7,
      "type": "word",
      "position": 0
    },
    {
      "token": "fast",
      "start_offset": 8,
      "end_offset": 16,
      "type": "word",
      "position": 1
    },
    {
      "token": "car",
      "start_offset": 17,
      "end_offset": 24,
      "type": "word",
      "position": 2
    }
  ]
}

带有负载存储的分词示例 #

若要在返回内容中带有负载,需创建一个存储词项向量的索引,并在索引映射中将 term_vector 设置为 with_positions_payloadswith_positions_offsets_payloads。例如,以下索引被配置为将负载存储到词项向量内容:

PUT /visible_payloads
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "term_vector": "with_positions_payloads",
        "analyzer": "custom_analyzer"
      }
    }
  },
  "settings": {
    "analysis": {
      "filter": {
        "my_payload_filter": {
          "type": "delimited_payload",
          "delimiter": "|",
          "encoding": "float"
        }
      },
      "analyzer": {
        "custom_analyzer": {
          "tokenizer": "whitespace",
          "filter": [ "my_payload_filter" ]
        }
      }
    }
  }
}

你可以使用以下请求将一个文档索引到这个索引中:

PUT /visible_payloads/_doc/1
{
  "text": "red|1.5 fast|2.0 car|1.0"
}

产生的词元 #

使用以下请求来检查使用该分词器生成的词元:

GET /visible_payloads/_termvectors/1
{
  "fields": ["text"]
}

返回内容中包含生成的词元,其中包括负载信息:

{
  "_index": "visible_payloads",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "found": true,
  "took": 5,
  "term_vectors": {
    "text": {
      "field_statistics": {
        "sum_doc_freq": 3,
        "doc_count": 1,
        "sum_ttf": 3
      },
      "terms": {
        "car": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 2,
              "payload": "P4AAAA=="
            }
          ]
        },
        "fast": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 1,
              "payload": "QAAAAA=="
            }
          ]
        },
        "red": {
          "term_freq": 1,
          "tokens": [
            {
              "position": 0,
              "payload": "P8AAAA=="
            }
          ]
        }
      }
    }
  }
}