キーワードマーカートークンフィルター

指定されたトークンをキーワードとしてマークし、ステミングされません。

keyword_marker フィルターは、指定されたトークンに keyword 属性を true として割り当てます。 stemmerporter_stem のようなステマー トークンフィルターは、keyword 属性が true のトークンをスキップします。

keyword_marker フィルターが正しく機能するためには、analyzer configuration の中で、他のステマー トークンフィルターの前にリストされている必要があります。

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

keyword_marker フィルターがどのように機能するかを見るには、まずステミングされたトークンを含むトークンストリームを生成する必要があります。

次の analyze API リクエストは、stemmer フィルターを使用して fox running and jumping のためのステミングされたトークンを作成します。

Python

  1. resp = client.indices.analyze(
  2. tokenizer="whitespace",
  3. filter=[
  4. "stemmer"
  5. ],
  6. text="fox running and jumping",
  7. )
  8. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'whitespace',
  4. filter: [
  5. 'stemmer'
  6. ],
  7. text: 'fox running and jumping'
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "whitespace",
  3. filter: ["stemmer"],
  4. text: "fox running and jumping",
  5. });
  6. console.log(response);

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "whitespace",
  4. "filter": [ "stemmer" ],
  5. "text": "fox running and jumping"
  6. }

リクエストは次のトークンを生成します。 runningrun にステミングされ、jumpingjump にステミングされました。

テキスト

  1. [ fox, run, and, jump ]

jumping がステミングされないようにするには、前の analyze API リクエストで keyword_marker フィルターを stemmer フィルターの前に追加します。 jumpingkeywords パラメータの keyword_marker フィルターに指定します。

Python

  1. resp = client.indices.analyze(
  2. tokenizer="whitespace",
  3. filter=[
  4. {
  5. "type": "keyword_marker",
  6. "keywords": [
  7. "jumping"
  8. ]
  9. },
  10. "stemmer"
  11. ],
  12. text="fox running and jumping",
  13. )
  14. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'whitespace',
  4. filter: [
  5. {
  6. type: 'keyword_marker',
  7. keywords: [
  8. 'jumping'
  9. ]
  10. },
  11. 'stemmer'
  12. ],
  13. text: 'fox running and jumping'
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "whitespace",
  3. filter: [
  4. {
  5. type: "keyword_marker",
  6. keywords: ["jumping"],
  7. },
  8. "stemmer",
  9. ],
  10. text: "fox running and jumping",
  11. });
  12. console.log(response);

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "whitespace",
  4. "filter": [
  5. {
  6. "type": "keyword_marker",
  7. "keywords": [ "jumping" ]
  8. },
  9. "stemmer"
  10. ],
  11. "text": "fox running and jumping"
  12. }

リクエストは次のトークンを生成します。 running はまだ run にステミングされていますが、jumping はステミングされていません。

テキスト

  1. [ fox, run, and, jumping ]

これらのトークンの keyword 属性を見るには、analyze API リクエストに次の引数を追加します:

  • explain: true
  • attributes: keyword

Python

  1. resp = client.indices.analyze(
  2. tokenizer="whitespace",
  3. filter=[
  4. {
  5. "type": "keyword_marker",
  6. "keywords": [
  7. "jumping"
  8. ]
  9. },
  10. "stemmer"
  11. ],
  12. text="fox running and jumping",
  13. explain=True,
  14. attributes="keyword",
  15. )
  16. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'whitespace',
  4. filter: [
  5. {
  6. type: 'keyword_marker',
  7. keywords: [
  8. 'jumping'
  9. ]
  10. },
  11. 'stemmer'
  12. ],
  13. text: 'fox running and jumping',
  14. explain: true,
  15. attributes: 'keyword'
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "whitespace",
  3. filter: [
  4. {
  5. type: "keyword_marker",
  6. keywords: ["jumping"],
  7. },
  8. "stemmer",
  9. ],
  10. text: "fox running and jumping",
  11. explain: true,
  12. attributes: "keyword",
  13. });
  14. console.log(response);

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "whitespace",
  4. "filter": [
  5. {
  6. "type": "keyword_marker",
  7. "keywords": [ "jumping" ]
  8. },
  9. "stemmer"
  10. ],
  11. "text": "fox running and jumping",
  12. "explain": true,
  13. "attributes": "keyword"
  14. }

API は次のレスポンスを返します。 jumping トークンには keyword 属性が true です。

コンソール-結果

  1. {
  2. "detail": {
  3. "custom_analyzer": true,
  4. "charfilters": [],
  5. "tokenizer": {
  6. "name": "whitespace",
  7. "tokens": [
  8. {
  9. "token": "fox",
  10. "start_offset": 0,
  11. "end_offset": 3,
  12. "type": "word",
  13. "position": 0
  14. },
  15. {
  16. "token": "running",
  17. "start_offset": 4,
  18. "end_offset": 11,
  19. "type": "word",
  20. "position": 1
  21. },
  22. {
  23. "token": "and",
  24. "start_offset": 12,
  25. "end_offset": 15,
  26. "type": "word",
  27. "position": 2
  28. },
  29. {
  30. "token": "jumping",
  31. "start_offset": 16,
  32. "end_offset": 23,
  33. "type": "word",
  34. "position": 3
  35. }
  36. ]
  37. },
  38. "tokenfilters": [
  39. {
  40. "name": "__anonymous__keyword_marker",
  41. "tokens": [
  42. {
  43. "token": "fox",
  44. "start_offset": 0,
  45. "end_offset": 3,
  46. "type": "word",
  47. "position": 0,
  48. "keyword": false
  49. },
  50. {
  51. "token": "running",
  52. "start_offset": 4,
  53. "end_offset": 11,
  54. "type": "word",
  55. "position": 1,
  56. "keyword": false
  57. },
  58. {
  59. "token": "and",
  60. "start_offset": 12,
  61. "end_offset": 15,
  62. "type": "word",
  63. "position": 2,
  64. "keyword": false
  65. },
  66. {
  67. "token": "jumping",
  68. "start_offset": 16,
  69. "end_offset": 23,
  70. "type": "word",
  71. "position": 3,
  72. "keyword": true
  73. }
  74. ]
  75. },
  76. {
  77. "name": "stemmer",
  78. "tokens": [
  79. {
  80. "token": "fox",
  81. "start_offset": 0,
  82. "end_offset": 3,
  83. "type": "word",
  84. "position": 0,
  85. "keyword": false
  86. },
  87. {
  88. "token": "run",
  89. "start_offset": 4,
  90. "end_offset": 11,
  91. "type": "word",
  92. "position": 1,
  93. "keyword": false
  94. },
  95. {
  96. "token": "and",
  97. "start_offset": 12,
  98. "end_offset": 15,
  99. "type": "word",
  100. "position": 2,
  101. "keyword": false
  102. },
  103. {
  104. "token": "jumping",
  105. "start_offset": 16,
  106. "end_offset": 23,
  107. "type": "word",
  108. "position": 3,
  109. "keyword": true
  110. }
  111. ]
  112. }
  113. ]
  114. }
  115. }

設定可能なパラメータ

  • ignore_case
  • (オプション、ブール値) true の場合、keywords および keywords_path パラメータの一致は大文字と小文字を無視します。 デフォルトは false です。
  • keywords
  • (必須*、文字列の配列) キーワードの配列。 これらのキーワードに一致するトークンはステミングされません。
    このパラメータ、keywords_path、または keywords_pattern のいずれかを指定する必要があります。 このパラメータと keywords_pattern を同時に指定することはできません。
  • keywords_path
  • (必須*、文字列) キーワードのリストを含むファイルへのパス。 これらのキーワードに一致するトークンはステミングされません。
    このパスは絶対パスまたは config の場所に対する相対パスであり、ファイルは UTF-8 エンコードされている必要があります。 ファイル内の各単語は改行で区切られている必要があります。
    このパラメータ、keywords、または keywords_pattern のいずれかを指定する必要があります。 このパラメータと keywords_pattern を同時に指定することはできません。
  • keywords_pattern
  • (必須*、文字列) トークンに一致するために使用される Java 正規表現。 この式に一致するトークンはキーワードとしてマークされ、ステミングされません。
    このパラメータ、keywords、または keywords_path のいずれかを指定する必要があります。 このパラメータと keywords または keywords_pattern を同時に指定することはできません。
    不適切に記述された正規表現は、Elasticsearch の動作を遅くしたり、スタックオーバーフローエラーを引き起こしたりし、実行中のノードが突然終了する原因となることがあります。

アナライザーのカスタマイズと追加

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

たとえば、次の create index API リクエストは、カスタム keyword_marker フィルターと porter_stem フィルターを使用して新しい custom analyzer を構成します。

カスタム keyword_marker フィルターは、analysis/example_word_list.txt ファイルに指定されたトークンをキーワードとしてマークします。 porter_stem フィルターはこれらのトークンをステミングしません。

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "my_custom_analyzer": {
  7. "type": "custom",
  8. "tokenizer": "standard",
  9. "filter": [
  10. "my_custom_keyword_marker_filter",
  11. "porter_stem"
  12. ]
  13. }
  14. },
  15. "filter": {
  16. "my_custom_keyword_marker_filter": {
  17. "type": "keyword_marker",
  18. "keywords_path": "analysis/example_word_list.txt"
  19. }
  20. }
  21. }
  22. },
  23. )
  24. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. my_custom_analyzer: {
  8. type: 'custom',
  9. tokenizer: 'standard',
  10. filter: [
  11. 'my_custom_keyword_marker_filter',
  12. 'porter_stem'
  13. ]
  14. }
  15. },
  16. filter: {
  17. my_custom_keyword_marker_filter: {
  18. type: 'keyword_marker',
  19. keywords_path: 'analysis/example_word_list.txt'
  20. }
  21. }
  22. }
  23. }
  24. }
  25. )
  26. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. my_custom_analyzer: {
  7. type: "custom",
  8. tokenizer: "standard",
  9. filter: ["my_custom_keyword_marker_filter", "porter_stem"],
  10. },
  11. },
  12. filter: {
  13. my_custom_keyword_marker_filter: {
  14. type: "keyword_marker",
  15. keywords_path: "analysis/example_word_list.txt",
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. PUT /my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_custom_analyzer": {
  7. "type": "custom",
  8. "tokenizer": "standard",
  9. "filter": [
  10. "my_custom_keyword_marker_filter",
  11. "porter_stem"
  12. ]
  13. }
  14. },
  15. "filter": {
  16. "my_custom_keyword_marker_filter": {
  17. "type": "keyword_marker",
  18. "keywords_path": "analysis/example_word_list.txt"
  19. }
  20. }
  21. }
  22. }
  23. }