区切りペイロードトークンフィルター

古い名前 delimited_payload_filter は非推奨であり、新しいインデックスでは使用しないでください。代わりに delimited_payload を使用してください。

指定された区切り文字に基づいて、トークンストリームをトークンとペイロードに分割します。

たとえば、delimited_payload フィルターを | 区切り文字と共に使用して、the|1 quick|2 fox|3 をトークン thequickfox に分割し、それぞれのペイロードは 123 になります。

このフィルターは、Lucene の DelimitedPayloadTokenFilter を使用します。

ペイロード

ペイロードは、トークン位置に関連付けられたユーザー定義のバイナリデータで、base64 エンコードされたバイトとして保存されます。

Elasticsearch はデフォルトでトークンペイロードを保存しません。ペイロードを保存するには、次の手順を実行する必要があります:

  • ペイロードを保存する任意のフィールドに対して、term_vector マッピングパラメータを with_positions_payloads または with_positions_offsets_payloads に設定します。
  • delimited_payload フィルターを含むインデックスアナライザーを使用します。

保存されたペイロードは、term vectors API を使用して表示できます。

次の analyze API リクエストは、デフォルトの | 区切り文字を使用して delimited_payload フィルターで the|0 brown|10 fox|5 is|0 quick|10 をトークンとペイロードに分割します。

Python

  1. resp = client.indices.analyze(
  2. tokenizer="whitespace",
  3. filter=[
  4. "delimited_payload"
  5. ],
  6. text="the|0 brown|10 fox|5 is|0 quick|10",
  7. )
  8. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'whitespace',
  4. filter: [
  5. 'delimited_payload'
  6. ],
  7. text: 'the|0 brown|10 fox|5 is|0 quick|10'
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "whitespace",
  3. filter: ["delimited_payload"],
  4. text: "the|0 brown|10 fox|5 is|0 quick|10",
  5. });
  6. console.log(response);

コンソール

  1. GET _analyze
  2. {
  3. "tokenizer": "whitespace",
  4. "filter": ["delimited_payload"],
  5. "text": "the|0 brown|10 fox|5 is|0 quick|10"
  6. }

フィルターは次のトークンを生成します:

テキスト

  1. [ the, brown, fox, is, quick ]

analyze API は保存されたペイロードを返さないことに注意してください。返されたペイロードを含む例については、保存されたペイロードを返すを参照してください。

アナライザーに追加

次の create index API リクエストは、delimited-payload フィルターを使用して新しい カスタムアナライザー を構成します。

Python

  1. resp = client.indices.create(
  2. index="delimited_payload",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "whitespace_delimited_payload": {
  7. "tokenizer": "whitespace",
  8. "filter": [
  9. "delimited_payload"
  10. ]
  11. }
  12. }
  13. }
  14. },
  15. )
  16. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'delimited_payload',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. whitespace_delimited_payload: {
  8. tokenizer: 'whitespace',
  9. filter: [
  10. 'delimited_payload'
  11. ]
  12. }
  13. }
  14. }
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.indices.create({
  2. index: "delimited_payload",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. whitespace_delimited_payload: {
  7. tokenizer: "whitespace",
  8. filter: ["delimited_payload"],
  9. },
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. PUT delimited_payload
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "whitespace_delimited_payload": {
  7. "tokenizer": "whitespace",
  8. "filter": [ "delimited_payload" ]
  9. }
  10. }
  11. }
  12. }
  13. }

設定可能なパラメータ

  • delimiter
  • (オプション、文字列)トークンとペイロードを区切るために使用される文字。デフォルトは | です。
  • encoding
  • (オプション、文字列)保存されたペイロードのデータ型。有効な値は:
    • float
    • (デフォルト)Float
    • identity
    • 文字
    • int
    • 整数

カスタマイズしてアナライザーに追加

delimited_payload フィルターをカスタマイズするには、それを複製して新しいカスタムトークンフィルターの基礎を作成します。設定可能なパラメータを使用してフィルターを変更できます。

たとえば、次の create index API リクエストは、カスタム delimited_payload フィルターを使用して新しい カスタムアナライザー を構成します。カスタム delimited_payload フィルターは、+ 区切り文字を使用してトークンとペイロードを区切ります。ペイロードは整数としてエンコードされます。

Python

  1. resp = client.indices.create(
  2. index="delimited_payload_example",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "whitespace_plus_delimited": {
  7. "tokenizer": "whitespace",
  8. "filter": [
  9. "plus_delimited"
  10. ]
  11. }
  12. },
  13. "filter": {
  14. "plus_delimited": {
  15. "type": "delimited_payload",
  16. "delimiter": "+",
  17. "encoding": "int"
  18. }
  19. }
  20. }
  21. },
  22. )
  23. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'delimited_payload_example',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. whitespace_plus_delimited: {
  8. tokenizer: 'whitespace',
  9. filter: [
  10. 'plus_delimited'
  11. ]
  12. }
  13. },
  14. filter: {
  15. plus_delimited: {
  16. type: 'delimited_payload',
  17. delimiter: '+',
  18. encoding: 'int'
  19. }
  20. }
  21. }
  22. }
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.indices.create({
  2. index: "delimited_payload_example",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. whitespace_plus_delimited: {
  7. tokenizer: "whitespace",
  8. filter: ["plus_delimited"],
  9. },
  10. },
  11. filter: {
  12. plus_delimited: {
  13. type: "delimited_payload",
  14. delimiter: "+",
  15. encoding: "int",
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. PUT delimited_payload_example
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "whitespace_plus_delimited": {
  7. "tokenizer": "whitespace",
  8. "filter": [ "plus_delimited" ]
  9. }
  10. },
  11. "filter": {
  12. "plus_delimited": {
  13. "type": "delimited_payload",
  14. "delimiter": "+",
  15. "encoding": "int"
  16. }
  17. }
  18. }
  19. }
  20. }

保存されたペイロードを返す

インデックスを作成するには、create index API を使用します:

Python

  1. resp = client.indices.create(
  2. index="text_payloads",
  3. mappings={
  4. "properties": {
  5. "text": {
  6. "type": "text",
  7. "term_vector": "with_positions_payloads",
  8. "analyzer": "payload_delimiter"
  9. }
  10. }
  11. },
  12. settings={
  13. "analysis": {
  14. "analyzer": {
  15. "payload_delimiter": {
  16. "tokenizer": "whitespace",
  17. "filter": [
  18. "delimited_payload"
  19. ]
  20. }
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'text_payloads',
  3. body: {
  4. mappings: {
  5. properties: {
  6. text: {
  7. type: 'text',
  8. term_vector: 'with_positions_payloads',
  9. analyzer: 'payload_delimiter'
  10. }
  11. }
  12. },
  13. settings: {
  14. analysis: {
  15. analyzer: {
  16. payload_delimiter: {
  17. tokenizer: 'whitespace',
  18. filter: [
  19. 'delimited_payload'
  20. ]
  21. }
  22. }
  23. }
  24. }
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.indices.create({
  2. index: "text_payloads",
  3. mappings: {
  4. properties: {
  5. text: {
  6. type: "text",
  7. term_vector: "with_positions_payloads",
  8. analyzer: "payload_delimiter",
  9. },
  10. },
  11. },
  12. settings: {
  13. analysis: {
  14. analyzer: {
  15. payload_delimiter: {
  16. tokenizer: "whitespace",
  17. filter: ["delimited_payload"],
  18. },
  19. },
  20. },
  21. },
  22. });
  23. console.log(response);

コンソール

  1. PUT text_payloads
  2. {
  3. "mappings": {
  4. "properties": {
  5. "text": {
  6. "type": "text",
  7. "term_vector": "with_positions_payloads",
  8. "analyzer": "payload_delimiter"
  9. }
  10. }
  11. },
  12. "settings": {
  13. "analysis": {
  14. "analyzer": {
  15. "payload_delimiter": {
  16. "tokenizer": "whitespace",
  17. "filter": [ "delimited_payload" ]
  18. }
  19. }
  20. }
  21. }
  22. }

ペイロードを含むドキュメントをインデックスに追加します。

Python

  1. resp = client.index(
  2. index="text_payloads",
  3. id="1",
  4. document={
  5. "text": "the|0 brown|3 fox|4 is|0 quick|10"
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.index(
  2. index: 'text_payloads',
  3. id: 1,
  4. body: {
  5. text: 'the|0 brown|3 fox|4 is|0 quick|10'
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.index({
  2. index: "text_payloads",
  3. id: 1,
  4. document: {
  5. text: "the|0 brown|3 fox|4 is|0 quick|10",
  6. },
  7. });
  8. console.log(response);

コンソール

  1. POST text_payloads/_doc/1
  2. {
  3. "text": "the|0 brown|3 fox|4 is|0 quick|10"
  4. }

term vectors API を使用して、ドキュメントのトークンと base64 エンコードされたペイロードを返します。

Python

  1. resp = client.termvectors(
  2. index="text_payloads",
  3. id="1",
  4. fields=[
  5. "text"
  6. ],
  7. payloads=True,
  8. )
  9. print(resp)

Ruby

  1. response = client.termvectors(
  2. index: 'text_payloads',
  3. id: 1,
  4. body: {
  5. fields: [
  6. 'text'
  7. ],
  8. payloads: true
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.termvectors({
  2. index: "text_payloads",
  3. id: 1,
  4. fields: ["text"],
  5. payloads: true,
  6. });
  7. console.log(response);

コンソール

  1. GET text_payloads/_termvectors/1
  2. {
  3. "fields": [ "text" ],
  4. "payloads": true
  5. }

API は次の応答を返します:

コンソール-結果

  1. {
  2. "_index": "text_payloads",
  3. "_id": "1",
  4. "_version": 1,
  5. "found": true,
  6. "took": 8,
  7. "term_vectors": {
  8. "text": {
  9. "field_statistics": {
  10. "sum_doc_freq": 5,
  11. "doc_count": 1,
  12. "sum_ttf": 5
  13. },
  14. "terms": {
  15. "brown": {
  16. "term_freq": 1,
  17. "tokens": [
  18. {
  19. "position": 1,
  20. "payload": "QEAAAA=="
  21. }
  22. ]
  23. },
  24. "fox": {
  25. "term_freq": 1,
  26. "tokens": [
  27. {
  28. "position": 2,
  29. "payload": "QIAAAA=="
  30. }
  31. ]
  32. },
  33. "is": {
  34. "term_freq": 1,
  35. "tokens": [
  36. {
  37. "position": 3,
  38. "payload": "AAAAAA=="
  39. }
  40. ]
  41. },
  42. "quick": {
  43. "term_freq": 1,
  44. "tokens": [
  45. {
  46. "position": 4,
  47. "payload": "QSAAAA=="
  48. }
  49. ]
  50. },
  51. "the": {
  52. "term_freq": 1,
  53. "tokens": [
  54. {
  55. "position": 0,
  56. "payload": "AAAAAA=="
  57. }
  58. ]
  59. }
  60. }
  61. }
  62. }
  63. }