すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:範囲クエリ

最終更新日:Apr 01, 2026

利用シーン

多くのビジネスシナリオで範囲クエリが必要とされます。 たとえば、O2O (オンライン-to-オフライン) ビジネスでは、ユーザーの位置から特定の距離内にある店舗を検索します。 商品検索では、価格帯による絞り込みが可能です。 バックエンドシステムでは、ビッグデータ検索において、特定の期間内の結果を見つけることがよく求められます。

使用方法

範囲クエリを実行するには、次の 3 つのステップに従います。

1. アプリケーションスキーマで、範囲クエリを実行したい各フィールドのフィールドタイプを定義します。

範囲クエリをサポートしているのは、以下のフィールドタイプのみです。 これらに従ってフィールドを設定する必要があります。

フィールドタイプ

説明

システム制限

INT

int64 整数です。 INT 型データに対する範囲クエリをサポートします。

このタイプのフィールドは最大 4 つまで設定できます。

TIMESTAMP

0 以上の整数タイムスタンプ (ミリ秒単位) です。 ストレージはミリ秒をサポートしますが、クエリの精度は秒単位までです。 下 3 桁はデフォルトで 000 になります。 タイムスタンプデータに対する範囲クエリをサポートします。

このタイプのフィールドは最大 4 つまで設定できます。

GEO_POINT

「lon lat」というフォーマットの文字列型です。 `lon` は経度、`lat` は緯度を表します。 どちらも double 型で、スペースで区切られます。 `lon` の範囲は [-180, 180]、`lat` の範囲は [-90, 90] です。

このタイプのフィールドは最大 2 つまで設定できます。

2. インデックススキーマで、これらのフィールドのインデックスを作成し、適切なアナライザを指定します。

TIMESTAMP、GEO_POINT、および INT フィールドには単一フィールドインデックスを作成できますが、結合インデックスは作成できません。

次の表に、これら 3 つのフィールドタイプで作成されたインデックスに推奨されるアナライザとその機能を示します。

単一フィールドインデックスのフィールドタイプ

範囲クエリ用のアナライザ名

アナライザの説明

INT

数値分析

形態素解析メソッド: 形態素解析なし。 インデックスタイプ: 範囲クエリ用の数値インデックス。

TIMESTAMP

数値分析

形態素解析メソッド: 形態素解析なし。 インデックスタイプ: 範囲クエリ用の数値インデックス。

GEO_POINT

地理的位置

形態素解析メソッド: 形態素解析なし。 インデックスタイプ: 範囲クエリ用の数値インデックス。

3. クエリで、範囲クエリの構文を使用します。

(1) INT および TIMESTAMP の範囲クエリ

範囲クエリの構文は、INT フィールドと TIMESTAMP フィールドの両方で同じです。 サポートされている構文は次のとおりです。

        index:[number1,number2]// number1 <= index <= number2
        index:[number1,number2)//  number1 <= index < number2
        index:(number1,number2]//  number1 < index <= number2
        index:(number1,number2)//  number1 < index < number2
        index:(,number2)// index < number2
        index:(number1,)// index > number1
        index:(,number2]// index <= number2
        index:[number1,)// index >= number1

注: インデックスのコロンの後に引用符を追加しないでください。

例:

価格が 100 USD から 200 USD の間の「dress」を検索する場合:

query=index_text:'dress' AND index_price:[100,200]

2019 年 6 月 1 日から 2019 年 6 月 3 日までの「Beijing」に関するニュースを検索する場合:

query=index_text:'Beijing' AND index_timestamp:[1559318400000,1559577599000]

(2) GEO_POINT の範囲クエリ

現在、ポイント、円、および矩形のクエリのみがサポートされています。 構文は次のとおりです。

  • ポイントのクエリ: query=spatial_index:'point(LON LAT)'

`LON` は経度、`LAT` は緯度を指定します。 たとえば、`query=spatial_index:'point(116.3906 39.92324)'` は、この正確な座標を含むドキュメントを検索します。

  • 円内のポイントをクエリして、中心点から特定の距離内にあるポイントを検索します。

query=spatial_index:'circle(LON LAT,Radius)'

`LON` は経度、`LAT` は緯度、`Radius` は半径をメートル単位で指定します。 クエリパフォーマンスは、半径が 10 km 以内の場合に最適です。 半径が 10 km を超えると、パフォーマンスは著しく低下します。 たとえば、`query=spatial_index:'circle(116.5806 39.99624, 1000)'` は、座標 '116.5806 39.99624' から 1000 メートル (1 km) 以内のドキュメントを検索します。

  • 矩形内のポイントのクエリ:

query=spatial_index:'rectangle(minX minY,maxX maxY)'

緯度の場合、`maxY` は `minY` 以上である必要があります。 これらの値が逆になった場合、システムは自動的に調整します。 経度の場合、`minX` から `maxX` までの範囲は西から東へと解釈されます。 これらの値が逆になると、クエリは不正な範囲を返します。 たとえば、`rectangle(116.3906 39.92324, 116.3907 39.92325)` は、これら 2 つの座標で形成される矩形内のドキュメントを検索します。

制限事項

  • TIMESTAMP フィールドタイプは、1970-01-01 00:00 から 2100-01-01 00:00 までのミリ秒単位のタイムスタンプをサポートします。これは、数値範囲 [0, 4102416000000] に対応します。 ストレージはミリ秒単位の精度をサポートしますが、クエリの精度は秒単位に制限されます。 クエリ中、タイムスタンプ値の下 3 桁はデフォルトで 000 になります。 4102416000000 を超える値は、上限値の 4102416000000 に丸められます。 この上限を超える値を区別するには、フィルターを使用する必要があります。

  • 数値分析インデックスで範囲クエリを実行する場合、範囲の上限は下限以上である必要があります。 そうでない場合、構文エラー (6112, クエリ句エラー) が報告されます。

  • GEO_POINT フィールドタイプでサポートされる値の範囲は、経度が -180 から 180、緯度が -90 から 90 です。