このトピックでは、インデックス検索における query 句の構文と使用方法について説明します。
概要
query 句は、すべての検索リクエストに必須です。 特定のインデックスフィールドで検索する内容を指定し、AND、OR、ANDNOT、RANK などの論理演算子を使用して、複数のクエリ条件間の関係を定義します。
例えば、title と subject のような 2 つの TEXT 型フィールドを、default という名前の単一の複合インデックスにまとめることができます。 この default インデックスに対する検索では、検索クエリが title または subject のソースフィールドのいずれかの内容と一致するドキュメントが取得されます。
あるいは、title フィールドのみに基づいて title_search という名前のインデックスを作成した場合、title_search に対するクエリは、検索クエリが title フィールドの内容と一致するドキュメントのみを返します。
構文
クエリ条件は、次の形式で指定します:
標準クエリ: index:'search query'^boost
範囲検索: index:'circle(longitude latitude,radius)'
範囲検索: index:[value1,value2]
-
index: インデックススキーマで定義される、検索対象のインデックスフィールドの名前です。この検索では、検索クエリがこのインデックスフィールドを構成するいずれかのソースフィールドに出現するドキュメントを検索します。
-
search query: 検索したい内容です。
-
boost: 検索クエリに適用する関連度ブーストです。 値は 0 から 99 までの整数でなければなりません。 指定しない場合のデフォルト値は 99 です。 このパラメーターはオプションであり、基本ソート式で
exact_match_boost()関数が設定されている場合にのみ有効になります。 -
複数のクエリ条件を組み合わせるには、
()、AND、OR、ANDNOT、RANKの論理演算子を使用します。 これらの演算子は、大文字で記述する必要があります。 演算子は、優先順位が低いものから高いものへ、RANK<OR<AND<ANDNOT<()の順序で評価されます。 -
フレーズクエリを実行するには、検索クエリを二重引用符 (
"") で囲みます。 フレーズクエリは、解析済みタームが元のフレーズと同じ順序と位置で出現するドキュメントを検索します。 -
範囲検索は、地理的位置や数値範囲のクエリをサポートします。 詳細については、「範囲検索」をご参照ください。
使用上の注意
-
query句は必須であり、空にすることはできません。 -
ANDNOT演算子は単独では使用できません。ANDNOTの左側にあるクエリ条件は、index_name:''のように空であってはなりません。 -
index1:'xxx' RANK index2:'xxx' AND index3:'xxx'のように、RANK演算子がクエリの末尾にない場合は、(index1:'xxx' RANK index2:'xxx') AND index3:'xxx'のように、RANK演算を括弧でグループ化する必要があります。 そうしない場合、後続のすべての条件がRANK演算に含まれ、クエリはindex1:'xxx' RANK (index2:'xxx' AND index3:'xxx')として解釈されます。 -
検索クエリは、一重引用符 (
' ') または二重引用符 (" ") で囲む必要があります。 そうしない場合、クエリが失敗したり、結果が返されなかったり、予期しない動作が発生したりする可能性があります。 -
複合インデックスの作成に使用できるのは、
TEXTまたはSHORT_TEXT型のフィールドのみです。 -
boost値が 0 未満の場合は 0 として扱われます。 99 を超える場合は 99 として扱われます。 -
さまざまな検索タイプの処理方法の詳細については、「組み込みアナライザー」をご参照ください。
例
-
titleインデックスフィールドに "Peking University" が含まれるドキュメントを検索します:query=title:'Peking University' -
titleインデックスフィールドに "Peking University" と "Zhejiang University" の両方が含まれるドキュメントを検索します:query=title:'Peking University' AND title:'Zhejiang University' -
titleインデックスフィールドに "Peking University" または "Zhejiang University" のいずれかが含まれ、かつtypeフィールドが「1」であるドキュメントを検索します:query=(title:'Peking University' OR title:'Zhejiang University') AND type:'1' -
titleインデックスフィールドに "Peking University" または "Zhejiang University" のいずれかが含まれるドキュメントを検索します。 この例は、ORの代替構文を示しています:query=title:'Peking University'|'Zhejiang University' -
titleインデックスフィールドに Peking University は含まれるが Tsinghua は含まれないドキュメントを検索します。titleに President も含まれる場合は、これらのドキュメントをより上位にランク付けします:query=(title:'Peking University' ANDNOT title:'Tsinghua') RANK title:'President' // 高度ソート式は text_relevance(title) です -
titleインデックスフィールドに Peking University という完全なフレーズが含まれるドキュメントを検索します。 これにより、"University of Beijing" のような、類似しているが別個のタームを持つドキュメントが一致するのを防ぎます:query=title:"Peking University" -
INT_ARRAY型のフィールドを検索します:// arr_index_1 としてインデックス化された INT_ARRAY フィールドがあるとします。 // このクエリは、配列に値 1 が含まれるドキュメントを取得します。 query=arr_index_1:'1' -
LITERAL_ARRAY型のフィールドを検索します:LITERAL_ARRAYは、各要素がトークン化されず、完全一致のみをサポートする文字列定数の配列です。tags_indexとしてインデックス化されたLITERAL_ARRAYフィールドがあるとします:// 配列内のいずれかの要素が 'Red' と完全に一致する場合にドキュメントが取得されます。 // 注: LITERAL_ARRAY は完全一致を実行するため、検索クエリは配列要素と同一である必要があります。 例えば、要素が 'Peking University' の場合、'Peking' で検索しても一致は返されません。 query=tags_index:'Red' // 配列に 'Red' または 'Blue' のいずれかが含まれるドキュメントを検索します。 query=tags_index:'Red' OR tags_index:'Blue'