シナリオ
多くのビジネスシナリオには範囲検索が含まれます。たとえば、オンライン to オフライン (O2O) ビジネスシナリオでは、地理的な場所の特定の範囲内にある販売店を検索できます。特定の価格帯の商品を検索できます。バックグラウンドで大量のデータを取得して、特定の期間の結果を検索できます。
手順
次の手順を実行して、範囲検索を実装できます。
1. アプリケーションスキーマを定義するときに、範囲検索の実行に使用するフィールドのフィールドタイプを設定します。
次の表に、範囲検索に使用できるフィールドタイプを示します。必要に応じてフィールドタイプを設定します。
タイプ | 説明 | 備考 |
INT | INT64 タイプ。INT タイプのフィールドを使用して、範囲検索を実行できます。 | このタイプのフィールドは最大 4 つまでサポートされています。 |
TIMESTAMP | 0 以上(ミリ秒単位)の整数タイムスタンプ。格納されるタイムスタンプの単位はミリ秒です。検索できるタイムスタンプの単位は秒です。デフォルトでは、最後の 3 桁は 000 に設定されています。TIMESTAMP タイプのフィールドを使用して、範囲検索を実行できます。 | このタイプのフィールドは最大 4 つまでサポートされています。 |
GEO_POINT | STRING タイプ(経度 緯度形式)。経度は経度を指定し、緯度は緯度を指定します。経度と緯度の値はどちらも DOUBLE タイプで、スペース文字で区切られています。経度パラメータの有効な値: [-180,180]。緯度パラメータの有効な値: [-90,90]。 | このタイプのフィールドは最大 2 つまでサポートされています。 |
2. インデックススキーマを定義するときに、手順 1 で定義されたフィールドタイプのフィールドのインデックスを作成し、対応するアナライザーを指定します。
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 人民元から 200 人民元の「ドレス」を検索します。
query=index_text: "Dresses" AND index_price:[100,200]
2019 年 6 月 1 日から 2019 年 6 月 3 日までの「北京」に関するニュースを検索します。
query=index_text:'Beijing' AND index_timestamp:[1559318400000,1559577599000]
(2) GEO_POINT タイプの範囲検索
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 キロメートル以下の円内で範囲検索を実行すると、最適なパフォーマンスを実現できます。半径が 10 キロメートルを超えると、パフォーマンスが大幅に低下します。たとえば、query=spatial_index:'circle(116.5806 39.99624, 1000)'
を使用して、経度と緯度の値が 116.5806 と 39.99624 である地理的ポイントの近くにある、半径 1,000 メートルの円内の地理的ポイントを検索できます。
長方形内の地理的ポイントを検索します。
query=spatial_index:'rectangle(minX minY,maxX maxY)'
緯度では、maxY パラメータの値は minY パラメータの値以上である必要があります。そうでない場合、maxY パラメータと minY パラメータの値は自動的に調整されます。minX パラメータと maxX パラメータは、西から東への経度を指定します。minX パラメータと maxX パラメータの値が反転している場合、経度の範囲が変わります。たとえば、rectangle(116.3906 39.92324, 116.3907 39.92325) を使用して、これらの座標によって形成される長方形内の地理的ポイントを検索できます。
使用上の注意
TIMESTAMP タイプの値の範囲は 1970-01-01 00:00 から 2100-01-01 00:00 までで、ミリ秒単位の精度です。格納されるタイムスタンプの単位はミリ秒です。検索できるタイムスタンプの単位は秒です。デフォルトでは、最後の 3 桁は 000 に設定されています。有効な値: [0,4102416000000]。値が 4102416000000 より大きい場合は、4102416000000 が使用されます。4102416000000 より大きい値を他の値と区別する場合は、フィルタリング用の filter 句を追加します。
数値分析のインデックスに基づいてクエリ検索を実行する場合、値区間の 2 番目の値は最初の値より大きくする必要があります。そうでない場合、エラーコード 6112 の次の構文エラーが返されます: クエリ句エラー。
GEO_POINT タイプのフィールドの経度の値の範囲は -180 から 180 までで、緯度の値の範囲は -90 から 90 までです。