インターバルクエリ
一致する用語の順序と近接性に基づいて文書を返します。
intervals
クエリは、少数の定義から構築された 一致ルール を使用します。これらのルールは、指定された field
の用語に適用されます。
定義は、テキストの本体における用語を跨ぐ最小インターバルのシーケンスを生成します。これらのインターバルは、親ソースによってさらに組み合わせたりフィルタリングしたりできます。
例リクエスト
次の intervals
検索は、my
favorite food
を含む文書を返し、hot water
または cold porridge
が my_text
フィールドに続きます。
この検索は、my_text
の値が my favorite food is cold
porridge
に一致しますが、when it's cold my favorite food is porridge
には一致しません。
Python
resp = client.search(
query={
"intervals": {
"my_text": {
"all_of": {
"ordered": True,
"intervals": [
{
"match": {
"query": "my favorite food",
"max_gaps": 0,
"ordered": True
}
},
{
"any_of": {
"intervals": [
{
"match": {
"query": "hot water"
}
},
{
"match": {
"query": "cold porridge"
}
}
]
}
}
]
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
intervals: {
my_text: {
all_of: {
ordered: true,
intervals: [
{
match: {
query: 'my favorite food',
max_gaps: 0,
ordered: true
}
},
{
any_of: {
intervals: [
{
match: {
query: 'hot water'
}
},
{
match: {
query: 'cold porridge'
}
}
]
}
}
]
}
}
}
}
}
)
puts response
Js
const response = await client.search({
query: {
intervals: {
my_text: {
all_of: {
ordered: true,
intervals: [
{
match: {
query: "my favorite food",
max_gaps: 0,
ordered: true,
},
},
{
any_of: {
intervals: [
{
match: {
query: "hot water",
},
},
{
match: {
query: "cold porridge",
},
},
],
},
},
],
},
},
},
},
});
console.log(response);
コンソール
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"all_of" : {
"ordered" : true,
"intervals" : [
{
"match" : {
"query" : "my favorite food",
"max_gaps" : 0,
"ordered" : true
}
},
{
"any_of" : {
"intervals" : [
{ "match" : { "query" : "hot water" } },
{ "match" : { "query" : "cold porridge" } }
]
}
}
]
}
}
}
}
}
インターバルのトップレベルパラメータ
<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
ルールが含まれています。hot
と porridge
の単語が10位置以内にあり、salty
の単語が間にない文書を返します:
Python
resp = client.search(
query={
"intervals": {
"my_text": {
"match": {
"query": "hot porridge",
"max_gaps": 10,
"filter": {
"not_containing": {
"match": {
"query": "salty"
}
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
intervals: {
my_text: {
match: {
query: 'hot porridge',
max_gaps: 10,
filter: {
not_containing: {
match: {
query: 'salty'
}
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
query: {
intervals: {
my_text: {
match: {
query: "hot porridge",
max_gaps: 10,
filter: {
not_containing: {
match: {
query: "salty",
},
},
},
},
},
},
},
});
console.log(response);
コンソール
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "hot porridge",
"max_gaps" : 10,
"filter" : {
"not_containing" : {
"match" : {
"query" : "salty"
}
}
}
}
}
}
}
}
スクリプトフィルター
スクリプトを使用して、開始位置、終了位置、および内部ギャップ数に基づいてインターバルをフィルタリングできます。次の filter
スクリプトは、interval
変数を start
、end
、gaps
メソッドと共に使用します:
Python
resp = client.search(
query={
"intervals": {
"my_text": {
"match": {
"query": "hot porridge",
"filter": {
"script": {
"source": "interval.start > 10 && interval.end < 20 && interval.gaps == 0"
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
intervals: {
my_text: {
match: {
query: 'hot porridge',
filter: {
script: {
source: 'interval.start > 10 && interval.end < 20 && interval.gaps == 0'
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
query: {
intervals: {
my_text: {
match: {
query: "hot porridge",
filter: {
script: {
source:
"interval.start > 10 && interval.end < 20 && interval.gaps == 0",
},
},
},
},
},
},
});
console.log(response);
コンソール
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "hot porridge",
"filter" : {
"script" : {
"source" : "interval.start > 10 && interval.end < 20 && interval.gaps == 0"
}
}
}
}
}
}
}
最小化
インターバルクエリは常にインターバルを最小化し、クエリが線形時間で実行できるようにします。これは、max_gaps
制限やフィルターを使用する際に驚くべき結果を引き起こすことがあります。たとえば、salty
が hot
porridge
というフレーズに含まれているかを検索する次のクエリを考えてみてください:
Python
resp = client.search(
query={
"intervals": {
"my_text": {
"match": {
"query": "salty",
"filter": {
"contained_by": {
"match": {
"query": "hot porridge"
}
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
intervals: {
my_text: {
match: {
query: 'salty',
filter: {
contained_by: {
match: {
query: 'hot porridge'
}
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
query: {
intervals: {
my_text: {
match: {
query: "salty",
filter: {
contained_by: {
match: {
query: "hot porridge",
},
},
},
},
},
},
},
});
console.log(response);
コンソール
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "salty",
"filter" : {
"contained_by" : {
"match" : {
"query" : "hot porridge"
}
}
}
}
}
}
}
}
このクエリは、hot porridge is
salty porridge
というフレーズを含む文書に 一致しません。なぜなら、hot
porridge
の一致クエリによって返されたインターバルは、この文書内の最初の2つの用語のみをカバーし、これらは salty
をカバーするインターバルと重ならないからです。