シングルトークンフィルター

隣接するトークンを連結することによって、トークンストリームにシングル(または単語 [n-grams](https://en.wikipedia.org/wiki/N-gram)を追加します。デフォルトでは、`````shingle````` トークンフィルターは二語のシングルとユニグラムを出力します。

例えば、多くのトークナイザーは the lazy dog[ the, lazy, dog ] に変換します。このストリームに二語のシングルを追加するには、shingle フィルターを使用できます: [ the, the lazy, lazy, lazy dog, dog ]

シングルは、match_phrase のようなフレーズクエリの速度を向上させるためによく使用されます。shingles フィルターを使用してシングルを作成するのではなく、適切な text フィールドに対して index-phrases マッピングパラメータを使用することをお勧めします。

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

次の analyze API リクエストは、shingle フィルターを使用して quick brown fox jumps のトークンストリームに二語のシングルを追加します:

Python

  1. resp = client.indices.analyze(
  2. tokenizer="whitespace",
  3. filter=[
  4. "shingle"
  5. ],
  6. text="quick brown fox jumps",
  7. )
  8. print(resp)

Ruby

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

Js

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

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "whitespace",
  4. "filter": [ "shingle" ],
  5. "text": "quick brown fox jumps"
  6. }

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

テキスト

  1. [ quick, quick brown, brown, brown fox, fox, fox jumps, jumps ]

2-3語のシングルを生成するには、analyze API リクエストに次の引数を追加します:

  • min_shingle_size: 2
  • max_shingle_size: 3

Python

  1. resp = client.indices.analyze(
  2. tokenizer="whitespace",
  3. filter=[
  4. {
  5. "type": "shingle",
  6. "min_shingle_size": 2,
  7. "max_shingle_size": 3
  8. }
  9. ],
  10. text="quick brown fox jumps",
  11. )
  12. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'whitespace',
  4. filter: [
  5. {
  6. type: 'shingle',
  7. min_shingle_size: 2,
  8. max_shingle_size: 3
  9. }
  10. ],
  11. text: 'quick brown fox jumps'
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "whitespace",
  3. filter: [
  4. {
  5. type: "shingle",
  6. min_shingle_size: 2,
  7. max_shingle_size: 3,
  8. },
  9. ],
  10. text: "quick brown fox jumps",
  11. });
  12. console.log(response);

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "whitespace",
  4. "filter": [
  5. {
  6. "type": "shingle",
  7. "min_shingle_size": 2,
  8. "max_shingle_size": 3
  9. }
  10. ],
  11. "text": "quick brown fox jumps"
  12. }

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

テキスト

  1. [ quick, quick brown, quick brown fox, brown, brown fox, brown fox jumps, fox, fox jumps, jumps ]

出力にシングルのみを含めるには、リクエストに output_unigrams 引数として false を追加します。

Python

  1. resp = client.indices.analyze(
  2. tokenizer="whitespace",
  3. filter=[
  4. {
  5. "type": "shingle",
  6. "min_shingle_size": 2,
  7. "max_shingle_size": 3,
  8. "output_unigrams": False
  9. }
  10. ],
  11. text="quick brown fox jumps",
  12. )
  13. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'whitespace',
  4. filter: [
  5. {
  6. type: 'shingle',
  7. min_shingle_size: 2,
  8. max_shingle_size: 3,
  9. output_unigrams: false
  10. }
  11. ],
  12. text: 'quick brown fox jumps'
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "whitespace",
  3. filter: [
  4. {
  5. type: "shingle",
  6. min_shingle_size: 2,
  7. max_shingle_size: 3,
  8. output_unigrams: false,
  9. },
  10. ],
  11. text: "quick brown fox jumps",
  12. });
  13. console.log(response);

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "whitespace",
  4. "filter": [
  5. {
  6. "type": "shingle",
  7. "min_shingle_size": 2,
  8. "max_shingle_size": 3,
  9. "output_unigrams": false
  10. }
  11. ],
  12. "text": "quick brown fox jumps"
  13. }

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

テキスト

  1. [ quick brown, quick brown fox, brown fox, brown fox jumps, fox jumps ]

アナライザーに追加

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

Python

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

Ruby

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

Js

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

コンソール

  1. PUT /my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "standard_shingle": {
  7. "tokenizer": "standard",
  8. "filter": [ "shingle" ]
  9. }
  10. }
  11. }
  12. }
  13. }

設定可能なパラメータ

  • max_shingle_size
  • (オプション、整数)シングルを作成する際に連結するトークンの最大数。デフォルトは 2
    この値は、デフォルトで 2min_shingle_size 引数よりも小さくすることはできません。この値と min_shingle_size 引数の差は、デフォルトで 3index.max_shingle_diff インデックスレベル設定を超えることはできません。
  • min_shingle_size
  • (オプション、整数)シングルを作成する際に連結するトークンの最小数。デフォルトは 2
    この値は、デフォルトで 2max_shingle_size 引数を超えることはできません。max_shingle_size 引数とこの値の差は、デフォルトで 3index.max_shingle_diff インデックスレベル設定を超えることはできません。
  • output_unigrams
  • (オプション、ブール値)true の場合、出力には元の入力トークンが含まれます。false の場合、出力にはシングルのみが含まれ、元の入力トークンは削除されます。デフォルトは true
  • output_unigrams_if_no_shingles
  • true の場合、出力にはシングルが生成されない場合のみ元の入力トークンが含まれます。シングルが生成される場合、出力にはシングルのみが含まれます。デフォルトは false
    このパラメータと output_unigrams パラメータの両方が true の場合、output_unigrams 引数のみが使用されます。
  • token_separator
  • (オプション、文字列)隣接するトークンを連結してシングルを形成するために使用されるセパレーター。デフォルトはスペース(" ")。
  • filler_token
  • (オプション、文字列)トークンを含まない空の位置の代わりにシングルで使用される文字列。このフィラートークンはシングルでのみ使用され、元のユニグラムでは使用されません。デフォルトはアンダースコア(_)。
    一部のトークンフィルター、例えば stop フィルターは、位置インクリメントが1より大きい場合にストップワードを削除するときに空の位置を作成します。

    次の analyze API リクエストでは、stop フィルターが a ストップワードを fox jumps a lazy dog から削除し、空の位置を作成します。その後の shingle フィルターは、この空の位置をシングル内のプラス記号(+)で置き換えます。

Python

  1. resp = client.indices.analyze(
  2. tokenizer="whitespace",
  3. filter=[
  4. {
  5. "type": "stop",
  6. "stopwords": [
  7. "a"
  8. ]
  9. },
  10. {
  11. "type": "shingle",
  12. "filler_token": "+"
  13. }
  14. ],
  15. text="fox jumps a lazy dog",
  16. )
  17. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'whitespace',
  4. filter: [
  5. {
  6. type: 'stop',
  7. stopwords: [
  8. 'a'
  9. ]
  10. },
  11. {
  12. type: 'shingle',
  13. filler_token: '+'
  14. }
  15. ],
  16. text: 'fox jumps a lazy dog'
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "whitespace",
  3. filter: [
  4. {
  5. type: "stop",
  6. stopwords: ["a"],
  7. },
  8. {
  9. type: "shingle",
  10. filler_token: "+",
  11. },
  12. ],
  13. text: "fox jumps a lazy dog",
  14. });
  15. console.log(response);

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "whitespace",
  4. "filter": [
  5. {
  6. "type": "stop",
  7. "stopwords": [ "a" ]
  8. },
  9. {
  10. "type": "shingle",
  11. "filler_token": "+"
  12. }
  13. ],
  14. "text": "fox jumps a lazy dog"
  15. }

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

テキスト

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

カスタマイズ

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

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

my_shingle_filter フィルターは min_shingle_size2max_shingle_size5 であるため、2-5語のシングルを生成します。このフィルターには output_unigrams 引数として false が含まれており、出力にはシングルのみが含まれます。

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "en": {
  7. "tokenizer": "standard",
  8. "filter": [
  9. "my_shingle_filter"
  10. ]
  11. }
  12. },
  13. "filter": {
  14. "my_shingle_filter": {
  15. "type": "shingle",
  16. "min_shingle_size": 2,
  17. "max_shingle_size": 5,
  18. "output_unigrams": False
  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. en: {
  8. tokenizer: 'standard',
  9. filter: [
  10. 'my_shingle_filter'
  11. ]
  12. }
  13. },
  14. filter: {
  15. my_shingle_filter: {
  16. type: 'shingle',
  17. min_shingle_size: 2,
  18. max_shingle_size: 5,
  19. output_unigrams: false
  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. en: {
  7. tokenizer: "standard",
  8. filter: ["my_shingle_filter"],
  9. },
  10. },
  11. filter: {
  12. my_shingle_filter: {
  13. type: "shingle",
  14. min_shingle_size: 2,
  15. max_shingle_size: 5,
  16. output_unigrams: false,
  17. },
  18. },
  19. },
  20. },
  21. });
  22. console.log(response);

コンソール

  1. PUT /my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "en": {
  7. "tokenizer": "standard",
  8. "filter": [ "my_shingle_filter" ]
  9. }
  10. },
  11. "filter": {
  12. "my_shingle_filter": {
  13. "type": "shingle",
  14. "min_shingle_size": 2,
  15. "max_shingle_size": 5,
  16. "output_unigrams": false
  17. }
  18. }
  19. }
  20. }
  21. }