クエリ句は、すべての検索文において必須の構成要素です。これは、検索クエリを 1 つ以上のインデックスフィールドにバインドすることで、検索対象を定義します。論理演算子(AND、OR、ANDNOT、RANK)を用いて複数の条件を組み合わせ、複雑な取得ロジックを表現できます。
クイック例 — タイトルに「OpenSearch」が含まれ、かつタグが「1」であるドキュメントを検索する場合:
query=title:'OpenSearch' AND tag:'1'構文
{
"query": "<クエリ文字列>"
}query フィールドには、インデックス名と検索クエリをペアで指定した文字列を指定します。以下では、基本的なキーワード検索からベクトル検索およびハイブリッド検索まで、サポートされるすべてのクエリ形式について説明します。
論理演算子
すべての演算子は大文字で指定する必要があります。同一式に複数の演算子が含まれる場合、評価順序は以下のとおりです(優先度:低 → 高):
RANK < OR < AND < ANDNOT < ()かっこ(())を使用して、デフォルトの評価順序をオーバーライドできます。たとえば、default:'A' OR default:'B' AND default:'C' は default:'A' OR (default:'B' AND default:'C') のように評価されます。A または B を最初にマッチさせる場合は、(default:'A' OR default:'B') AND default:'C' と記述してください。
| オペレーター | 返されるドキュメント |
|---|---|
AND | 両方の条件に一致 |
OR | いずれかの条件に一致 |
ANDNOT | 左の条件に一致し、右の条件に一致するドキュメントを除外します |
RANK | 左側の条件を満たすが、右側の条件は返されるドキュメントの対象にはならず、関連性スコアのみに影響を与える |
() | 評価順序を制御するために条件をグループ化する |
例:
# 「Mobile Phone」と「Bluetooth」の両方を含むドキュメント
query=default:'Mobile Phone' AND default:'Bluetooth'
# 「Mobile Phone」または「Bluetooth」を含むドキュメント
query=default:'Mobile Phone' OR default:'Bluetooth'
# 「Mobile Phone」を含み、「Bluetooth」を含まないドキュメント
query=default:'Mobile Phone' ANDNOT default:'Bluetooth'
# 「Mobile Phone」を含むドキュメントを検索し、「Bluetooth」も言及されている場合に高い関連性スコアを付与
query=default:'Mobile Phone' RANK default:'Bluetooth'シンプルクエリ
<インデックス名>:'<検索クエリ>'^<boost> <演算子> <インデックス名>:'<検索クエリ>'^<boost>| パラメーター | 型 | 必須 | デフォルト値 | 説明 |
|---|---|---|---|---|
| インデックス名 | — | はい | — | 検索対象のインデックスです。このインデックスはインデックススキーマに存在している必要があります。システムは、そのインデックスが構築されたフィールド値をスキャンし、一致するドキュメントを返します。 |
| 検索クエリ | — | はい | — | 検索対象となる語またはフレーズです。 |
boost | INT | いいえ | 99 | この条件に対する関連性重みです。有効範囲:0~99。値が大きいほど、他のクエリ句と比較して一致したドキュメントの順位が高くなります。 |
高度なクエリ
同一インデックスに対する複数の検索クエリ
インデックス名を繰り返さずに、同一インデックスに対して複数の検索クエリを適用するには、|(OR)または &(AND)を使用します:
<インデックス名>:'<クエリ1>'^boost | '<クエリ2>'^boost
<インデックス名>:'<クエリ1>'^boost & '<クエリ2>'^boostフレーズクエリ
検索クエリを二重引用符で囲むと、完全一致のフレーズマッチが要求されます。すべての語は、解析前後を問わず、隣接して同じ順序で出現する必要があります:
<インデックス名>:"<検索クエリ>"^boostプログラムでクエリ句を構築する際は、二重引用符をエスケープしてください。
地理情報クエリ
SPATIAL 型インデックスを使用して、空間位置に基づきドキュメントを検索します:
<インデックス名>:'<SHAPE(ARGS...)>'サポートされる形状:
| 形状 | 構文 | 備考 |
|---|---|---|
| ポイント | point(LON LAT) | 経度と緯度の間は半角スペースで区切ります。 |
| サークル | circle(LON LAT,Radius) | Radius の単位はメートルです。 |
| レクタングル | rectangle(minLON minLAT,maxLON maxLAT) | maxLAT は minLAT 以上である必要があります(違反時は自動補正されます)。minLON は maxLON より小さくなければなりません(違反時は自動補正されず、誤った結果を返します)。 |
| ポリゴン | polygon(LON1 LAT1,LON2 LAT2,...) | 凸および凹のポリゴンをサポートします。開始点と終了点は同一である必要があります。隣接する辺は共線であってはならず、辺同士が交差してはなりません。 |
使用上の注意点:
インデックスは SPATIAL 型である必要があります。
形状式はシングルクォートで囲んでください。例:
query=spatial_index:'circle(130.0 10.0,1000.0)'ラインおよびポリゴンのポイント座標は、180° 経線を横断するかどうかに関わらず、平面上の世界地図に投影されます。
位置フィールドに対する逆インデックスの結果は正確ですが、ラインおよびポリゴンフィールドに対する結果は、クエリ実行後のフィルタリングが必要です。
範囲クエリ
角括弧表記を用いて、数値または日付の範囲を検索します。開区間の端点(( ))は排他的であり、閉区間の端点([ ])は包括的です。
数値範囲 — インデックスフィールドは数値型である必要があります。整数のみをサポートし、浮動小数点値はサポートしません。
<インデックス名>:(<開始値>,<終了値>]| 例 | 該当する条件 |
|---|---|
query=price:(3,100) | price > 3 かつ price < 100 |
query=price:[3,100] | price >= 3 かつ price <= 100 |
query=price:(3,100] | price > 3 かつ price <= 100 |
query=price:(,100) | price < 100(下限なし) |
日付範囲 — インデックスフィールドは DATE 型である必要があります。タイムスタンプはミリ秒単位の INTEGER 値で指定します。
<インデックス名>:(<開始時刻_ms>,<終了時刻_ms>]| 境界 | デフォルト値 | 説明 |
|---|---|---|
| 開始 | 0 | 省略された場合、タイムスタンプ 0 からスキャンを開始します。 |
| 終了 | 4102416000000 | 2100 年 1 月 1 日 00:00 を表します。指定した値がこれを超える場合、システムは 4102416000000 を使用します。 |
例
テキストベースのクエリ
query=title:'Peking University' AND vector:'0.377796,-0.958450,0.409853,-0.238177,-1.293826,0.356797,-0.295727,0.847301,-1.220337,0.148032,-1.128458,0.903187,0.509352,0.293686,-1.005852,-0.488839,0.888227,-0.555556,-0.658025,0.267552,-0.567601,0.003045,0.591734,-0.515983,-1.316453,-1.462450,0.091946,1.554954,0.384802,0.720498,0.144338,1.217826,0.724039,0.044212,0.571332,-1.425430,0.618965,0.481887,-1.617787,1.505416,-0.683652,1.030900,0.562021,0.162437,0.816546,0.112229,-0.739288,-0.342643,-0.199292,0.508368,-1.384887,-1.842170,0.952622,-1.699499,0.199430,-0.232464,-0.273227,-0.383696,-0.511302,0.005458,1.873572,-0.926169,-0.417587,-0.660156'ベクトルベースのクエリ
すべてのベクトル例では、query=<ベクトルインデックス>:'<ベクトルデータ>' のパターンを使用します。上位 N 件の取得を行うには、クエリ文字列内に &n=<件数> を追加します。
# 64 次元のベクトルインデックスをクエリ
query=vector:'0.377796,-0.958450,0.409853,-0.238177,-1.293826,0.356797,-0.295727,0.847301,-1.220337,0.148032,-1.128458,0.903187,0.509352,0.293686,-1.005852,-0.488839,0.888227,-0.555556,-0.658025,0.267552,-0.567601,0.003045,0.591734,-0.515983,-1.316453,-1.462450,0.091946,1.554954,0.384802,0.720498,0.144338,1.217826,0.724039,0.044212,0.571332,-1.425430,0.618965,0.481887,-1.617787,1.505416,-0.683652,1.030900,0.562021,0.162437,0.816546,0.112229,-0.739288,-0.342643,-0.199292,0.508368,-1.384887,-1.842170,0.952622,-1.699499,0.199430,-0.232464,-0.273227,-0.383696,-0.511302,0.005458,1.873572,-0.926169,-0.417587,-0.660156'
# 最近傍の上位 10 個のベクトルを返す
query=vector_index:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6&n=10'ハイブリッドクエリ(テキスト+ベクトル)
キーワード条件とベクトル条件を AND で組み合わせることで、テキストによるフィルタリングを行いながら、ベクトル類似度に基づいた順位付けを実現できます:
query=title:'Peking University' AND vector:'0.377796,-0.958450,0.409853,-0.238177,-1.293826,0.356797,-0.295727,0.847301,-1.220337,0.148032,-1.128458,0.903187,0.509352,0.293686,-1.005852,-0.488839,0.888227,-0.555556,-0.658025,0.267552,-0.567601,0.003045,0.591734,-0.515983,-1.316453,-1.462450,0.091946,1.554954,0.384802,0.720498,0.144338,1.217826,0.724039,0.044212,0.571332,-1.425430,0.618965,0.481887,-1.617787,1.505416,-0.683652,1.030900,0.562021,0.162437,0.816546,0.112229,-0.739288,-0.342643,-0.199292,0.508368,-1.384887,-1.842170,0.952622,-1.699499,0.199430,-0.232464,-0.273227,-0.383696,-0.511302,0.005458,1.873572,-0.926169,-0.417587,-0.660156'