インターバルクエリ

一致する用語の順序と近接性に基づいて文書を返します。

intervals クエリは、少数の定義から構築された 一致ルール を使用します。これらのルールは、指定された field の用語に適用されます。

定義は、テキストの本体における用語を跨ぐ最小インターバルのシーケンスを生成します。これらのインターバルは、親ソースによってさらに組み合わせたりフィルタリングしたりできます。

例リクエスト

次の intervals 検索は、my favorite food を含む文書を返し、hot water または cold porridgemy_text フィールドに続きます。

この検索は、my_text の値が my favorite food is cold porridge に一致しますが、when it's cold my favorite food is porridge には一致しません。

Python

  1. resp = client.search(
  2. query={
  3. "intervals": {
  4. "my_text": {
  5. "all_of": {
  6. "ordered": True,
  7. "intervals": [
  8. {
  9. "match": {
  10. "query": "my favorite food",
  11. "max_gaps": 0,
  12. "ordered": True
  13. }
  14. },
  15. {
  16. "any_of": {
  17. "intervals": [
  18. {
  19. "match": {
  20. "query": "hot water"
  21. }
  22. },
  23. {
  24. "match": {
  25. "query": "cold porridge"
  26. }
  27. }
  28. ]
  29. }
  30. }
  31. ]
  32. }
  33. }
  34. }
  35. },
  36. )
  37. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. intervals: {
  5. my_text: {
  6. all_of: {
  7. ordered: true,
  8. intervals: [
  9. {
  10. match: {
  11. query: 'my favorite food',
  12. max_gaps: 0,
  13. ordered: true
  14. }
  15. },
  16. {
  17. any_of: {
  18. intervals: [
  19. {
  20. match: {
  21. query: 'hot water'
  22. }
  23. },
  24. {
  25. match: {
  26. query: 'cold porridge'
  27. }
  28. }
  29. ]
  30. }
  31. }
  32. ]
  33. }
  34. }
  35. }
  36. }
  37. }
  38. )
  39. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. intervals: {
  4. my_text: {
  5. all_of: {
  6. ordered: true,
  7. intervals: [
  8. {
  9. match: {
  10. query: "my favorite food",
  11. max_gaps: 0,
  12. ordered: true,
  13. },
  14. },
  15. {
  16. any_of: {
  17. intervals: [
  18. {
  19. match: {
  20. query: "hot water",
  21. },
  22. },
  23. {
  24. match: {
  25. query: "cold porridge",
  26. },
  27. },
  28. ],
  29. },
  30. },
  31. ],
  32. },
  33. },
  34. },
  35. },
  36. });
  37. console.log(response);

コンソール

  1. POST _search
  2. {
  3. "query": {
  4. "intervals" : {
  5. "my_text" : {
  6. "all_of" : {
  7. "ordered" : true,
  8. "intervals" : [
  9. {
  10. "match" : {
  11. "query" : "my favorite food",
  12. "max_gaps" : 0,
  13. "ordered" : true
  14. }
  15. },
  16. {
  17. "any_of" : {
  18. "intervals" : [
  19. { "match" : { "query" : "hot water" } },
  20. { "match" : { "query" : "cold porridge" } }
  21. ]
  22. }
  23. }
  24. ]
  25. }
  26. }
  27. }
  28. }
  29. }

インターバルのトップレベルパラメータ

  • <field>
  • (必須、ルールオブジェクト) 検索したいフィールド。
    このパラメータの値は、一致する用語、順序、および近接性に基づいて文書を一致させるために使用されるルールオブジェクトです。
    有効なルールには次が含まれます:

一致ルールパラメータ

match ルールは、分析されたテキストに一致します。

  • query
  • (必須、文字列) 提供された <field> で見つけたいテキスト。
  • max_gaps
  • (オプション、整数) 一致する用語間の最大位置数。この数よりも離れた用語は一致と見なされません。デフォルトは -1 です。
    指定されていない場合、または -1 に設定されている場合、一致に幅の制限はありません。 0 に設定されている場合、用語は隣接して表示される必要があります。
  • ordered
  • (オプション、ブール値) true の場合、一致する用語は指定された順序で表示される必要があります。デフォルトは false です。
  • analyzer
  • (オプション、文字列) analyzer は、query の用語を分析するために使用されます。デフォルトはトップレベルの <field> のアナライザーです。
  • filter
  • (オプション、インターバルフィルター ルールオブジェクト) オプションのインターバルフィルター。
  • use_field
  • (オプション、文字列) 指定されている場合、このフィールドからのインターバルを一致させるのではなく、トップレベルの <field> からのインターバルを一致させます。用語はこのフィールドの検索アナライザーを使用して分析されます。これにより、すべてのフィールドが同じフィールドであるかのように、複数のフィールドを横断して検索できます。たとえば、同じテキストをステム化されたフィールドと非ステム化されたフィールドにインデックスし、非ステム化されたトークンの近くにステム化されたトークンを検索できます。

接頭辞ルールパラメータ

prefix ルールは、指定された文字のセットで始まる用語に一致します。この接頭辞は、最大128の用語に一致するように拡張できます。接頭辞が128を超える用語に一致する場合、Elasticsearchはエラーを返します。フィールドマッピングで index-prefixes オプションを使用して、この制限を回避できます。

  • prefix
  • (必須、文字列) トップレベルの <field> で見つけたい用語の最初の文字。
  • analyzer
  • (オプション、文字列) analyzer は、prefix を正規化するために使用されます。デフォルトはトップレベルの <field> のアナライザーです。
  • use_field
  • (オプション、文字列) 指定されている場合、このフィールドからのインターバルを一致させるのではなく、トップレベルの <field> からのインターバルを一致させます。
    prefix は、このフィールドの検索アナライザーを使用して正規化されますが、別の analyzer が指定されている場合は除きます。

ワイルドカードルールパラメータ

wildcard ルールは、ワイルドカードパターンを使用して用語に一致します。このパターンは、最大128の用語に一致するように拡張できます。パターンが128を超える用語に一致する場合、Elasticsearchはエラーを返します。

  • pattern
  • (必須、文字列) 一致する用語を見つけるために使用されるワイルドカードパターン。
    このパラメータは、2つのワイルドカード演算子をサポートします:
    • ?、これは任意の単一文字に一致します
    • *、これはゼロまたはそれ以上の文字に一致し、空の文字も含まれます
      * または ? で始まるパターンは避けてください。これにより、一致する用語を見つけるために必要な反復回数が増加し、検索パフォーマンスが低下する可能性があります。
  • analyzer
  • (オプション、文字列) analyzer は、pattern を正規化するために使用されます。デフォルトはトップレベルの <field> のアナライザーです。
  • use_field
  • (オプション、文字列) 指定されている場合、このフィールドからのインターバルを一致させるのではなく、トップレベルの <field> からのインターバルを一致させます。
    pattern は、このフィールドの検索アナライザーを使用して正規化されますが、analyzer が別に指定されている場合は除きます。

ファジールールパラメータ

fuzzy ルールは、提供された用語に似た用語に一致します。これは、Fuzziness で定義された編集距離内です。ファジー拡張が128を超える用語に一致する場合、Elasticsearchはエラーを返します。

  • term
  • (必須、文字列) 一致させる用語
  • prefix_length
  • (オプション、整数) 拡張を作成する際に変更されない最初の文字数。デフォルトは 0 です。
  • transpositions
  • (オプション、ブール値) 編集に隣接する2文字の転置が含まれるかどうかを示します (ab → ba)。デフォルトは true です。
  • fuzziness
  • (オプション、文字列) 一致のために許可される最大編集距離。 Fuzziness の有効な値と詳細については、こちらを参照してください。デフォルトは auto です。
  • analyzer
  • (オプション、文字列) analyzer は、term を正規化するために使用されます。デフォルトはトップレベルの <field> のアナライザーです。
  • use_field
  • (オプション、文字列) 指定されている場合、このフィールドからのインターバルを一致させるのではなく、トップレベルの <field> からのインターバルを一致させます。
    term は、このフィールドの検索アナライザーを使用して正規化されますが、analyzer が別に指定されている場合は除きます。

all_of ルールパラメータ

all_of ルールは、他のルールの組み合わせを跨ぐ一致を返します。

  • intervals
  • (必須、ルールオブジェクトの配列) 組み合わせるルールの配列。すべてのルールは、全体のソースが一致するために文書内で一致を生成する必要があります。
  • max_gaps
  • (オプション、整数) 一致する用語間の最大位置数。ルールによって生成されたインターバルがこの数よりも離れている場合、一致とは見なされません。デフォルトは -1 です。
    指定されていない場合、または -1 に設定されている場合、一致に幅の制限はありません。 0 に設定されている場合、用語は隣接して表示される必要があります。
  • ordered
  • (オプション、ブール値) true の場合、ルールによって生成されたインターバルは、指定された順序で表示される必要があります。デフォルトは false です。
  • filter
  • (オプション、インターバルフィルター ルールオブジェクト) 返されたインターバルをフィルタリングするために使用されるルール。

any_of ルールパラメータ

any_of ルールは、そのサブルールのいずれかによって生成されたインターバルを返します。

  • intervals
  • (必須、ルールオブジェクトの配列) 一致させるルールの配列。
  • filter
  • (オプション、インターバルフィルター ルールオブジェクト) 返されたインターバルをフィルタリングするために使用されるルール。

フィルタールールパラメータ

filter ルールは、クエリに基づいてインターバルを返します。例については、フィルターの例 を参照してください。

  • after
  • (オプション、クエリオブジェクト) filter ルールからのインターバルに続くインターバルを返すために使用されるクエリ。
  • before
  • (オプション、クエリオブジェクト) filter ルールからのインターバルの前に発生するインターバルを返すために使用されるクエリ。
  • contained_by
  • (オプション、クエリオブジェクト) filter ルールからのインターバルに含まれるインターバルを返すために使用されるクエリ。
  • containing
  • (オプション、クエリオブジェクト) filter ルールからのインターバルを含むインターバルを返すために使用されるクエリ。
  • not_contained_by
  • (オプション、クエリオブジェクト) filter ルールからのインターバルに 含まれない インターバルを返すために使用されるクエリ。
  • not_containing
  • (オプション、クエリオブジェクト) filter ルールからのインターバルを 含まない インターバルを返すために使用されるクエリ。
  • not_overlapping
  • (オプション、クエリオブジェクト) filter ルールからのインターバルと 重ならない インターバルを返すために使用されるクエリ。
  • overlapping
  • (オプション、クエリオブジェクト) filter ルールからのインターバルと重なるインターバルを返すために使用されるクエリ。
  • script
  • (オプション、スクリプトオブジェクト) 一致する文書を返すために使用されるスクリプト。このスクリプトはブール値を返す必要があります。true または falseスクリプトフィルター の例については、こちらを参照してください。

ノート

フィルターの例

次の検索には filter ルールが含まれています。hotporridge の単語が10位置以内にあり、salty の単語が間にない文書を返します:

Python

  1. resp = client.search(
  2. query={
  3. "intervals": {
  4. "my_text": {
  5. "match": {
  6. "query": "hot porridge",
  7. "max_gaps": 10,
  8. "filter": {
  9. "not_containing": {
  10. "match": {
  11. "query": "salty"
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }
  18. },
  19. )
  20. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. intervals: {
  5. my_text: {
  6. match: {
  7. query: 'hot porridge',
  8. max_gaps: 10,
  9. filter: {
  10. not_containing: {
  11. match: {
  12. query: 'salty'
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. )
  22. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. intervals: {
  4. my_text: {
  5. match: {
  6. query: "hot porridge",
  7. max_gaps: 10,
  8. filter: {
  9. not_containing: {
  10. match: {
  11. query: "salty",
  12. },
  13. },
  14. },
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. POST _search
  2. {
  3. "query": {
  4. "intervals" : {
  5. "my_text" : {
  6. "match" : {
  7. "query" : "hot porridge",
  8. "max_gaps" : 10,
  9. "filter" : {
  10. "not_containing" : {
  11. "match" : {
  12. "query" : "salty"
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }

スクリプトフィルター

スクリプトを使用して、開始位置、終了位置、および内部ギャップ数に基づいてインターバルをフィルタリングできます。次の filter スクリプトは、interval 変数を startendgaps メソッドと共に使用します:

Python

  1. resp = client.search(
  2. query={
  3. "intervals": {
  4. "my_text": {
  5. "match": {
  6. "query": "hot porridge",
  7. "filter": {
  8. "script": {
  9. "source": "interval.start > 10 && interval.end < 20 && interval.gaps == 0"
  10. }
  11. }
  12. }
  13. }
  14. }
  15. },
  16. )
  17. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. intervals: {
  5. my_text: {
  6. match: {
  7. query: 'hot porridge',
  8. filter: {
  9. script: {
  10. source: 'interval.start > 10 && interval.end < 20 && interval.gaps == 0'
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. intervals: {
  4. my_text: {
  5. match: {
  6. query: "hot porridge",
  7. filter: {
  8. script: {
  9. source:
  10. "interval.start > 10 && interval.end < 20 && interval.gaps == 0",
  11. },
  12. },
  13. },
  14. },
  15. },
  16. },
  17. });
  18. console.log(response);

コンソール

  1. POST _search
  2. {
  3. "query": {
  4. "intervals" : {
  5. "my_text" : {
  6. "match" : {
  7. "query" : "hot porridge",
  8. "filter" : {
  9. "script" : {
  10. "source" : "interval.start > 10 && interval.end < 20 && interval.gaps == 0"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }

最小化

インターバルクエリは常にインターバルを最小化し、クエリが線形時間で実行できるようにします。これは、max_gaps 制限やフィルターを使用する際に驚くべき結果を引き起こすことがあります。たとえば、saltyhot porridge というフレーズに含まれているかを検索する次のクエリを考えてみてください:

Python

  1. resp = client.search(
  2. query={
  3. "intervals": {
  4. "my_text": {
  5. "match": {
  6. "query": "salty",
  7. "filter": {
  8. "contained_by": {
  9. "match": {
  10. "query": "hot porridge"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }
  17. },
  18. )
  19. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. intervals: {
  5. my_text: {
  6. match: {
  7. query: 'salty',
  8. filter: {
  9. contained_by: {
  10. match: {
  11. query: 'hot porridge'
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }
  20. )
  21. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. intervals: {
  4. my_text: {
  5. match: {
  6. query: "salty",
  7. filter: {
  8. contained_by: {
  9. match: {
  10. query: "hot porridge",
  11. },
  12. },
  13. },
  14. },
  15. },
  16. },
  17. },
  18. });
  19. console.log(response);

コンソール

  1. POST _search
  2. {
  3. "query": {
  4. "intervals" : {
  5. "my_text" : {
  6. "match" : {
  7. "query" : "salty",
  8. "filter" : {
  9. "contained_by" : {
  10. "match" : {
  11. "query" : "hot porridge"
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }

このクエリは、hot porridge is salty porridge というフレーズを含む文書に 一致しません。なぜなら、hot porridge の一致クエリによって返されたインターバルは、この文書内の最初の2つの用語のみをカバーし、これらは salty をカバーするインターバルと重ならないからです。