シナリオ
多くのビジネスシナリオには範囲検索が含まれます。たとえば、オンライン to オフライン (O2O) ビジネスシナリオでは、地理的な場所の特定の範囲内にあるベンダーを検索できます。特定の価格帯の商品を検索できます。バックグラウンドで大量のデータを取得して、特定の期間の結果を検索できます。
手順
範囲検索は3つのステップで実装されます。
1. アプリケーションスキーマを定義するときに、範囲検索を実行するために使用するフィールドのフィールドタイプを設定します。
次の表に、範囲検索に使用できるフィールドタイプを示します。必要に応じてフィールドタイプを設定します。
タイプ | 説明 | 備考 |
INT | INT64タイプ。INTタイプのフィールドは、範囲検索を実行するために使用できます。 | このタイプのフィールドは最大4つまでサポートされています。 |
TIMESTAMP | 0以上の整数タイムスタンプ(ミリ秒単位)。TIMESTAMPタイプのフィールドは、範囲検索を実行するために使用できます。 | このタイプのフィールドは最大4つまでサポートされています。 |
GEO_POINT | STRINGタイプ、lon lat形式。lonは経度を表し、latは緯度を表します。経度と緯度の値はどちらもDOUBLEタイプで、スペースで区切る必要があります。lonパラメータの有効な値:[-180,180]。latパラメータの有効な値:[-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までで、ミリ秒単位の精度です。有効な値:[0,4102416000000]。値が4102416000000より大きい場合、4102416000000が使用されます。4102416000000より大きい値を他の値と区別する場合は、フィルタリング用のフィルタ句を追加します。
数値分析のインデックスに基づいてクエリ検索を実行する場合、値区間の2番目の値は最初の値よりも大きくなければなりません。そうでない場合、エラーコード6112の次の構文エラーが返されます:クエリ句エラー。
GEO_POINTタイプのフィールドの経度の値の範囲は-180〜180で、緯度の値の範囲は-90〜90です。