filter 句は、フィールド条件に基づいて検索結果をフィルタリングします。このトピックでは、構文、注意事項、および例について説明します。
句の説明
フィルタリング機能は、query 句が返すドキュメントを、指定された条件に基づいて絞り込み、最終的な結果セットを返します。
構文
フィルター条件の形式は field=value です。
-
フィルター条件では、
>、<、=、<=、>=、!=、in、notinなどの一般的な条件演算子が使用できます。また、+、-、*、/、&、^、|などの算術演算子も使用できます。 -
ANDやORなどの論理演算子を使用して複数のフィルター条件を組み合わせ、括弧()でグループ化することができます。論理演算子は、大文字で記述する必要があります。
注意事項
-
filter句はオプションです。 -
filter句で使用されるフィールドは、アプリケーションスキーマでプロパティフィールドとして設定されている必要があります。 -
精度の問題が発生する可能性があるため、
FLOAT型およびDOUBLE型のデータでは等価比較はできません。これらのデータ型には、代わりに>と<を使用した範囲条件を使用してください。 -
filter句では、LITERAL型フィールドの値は二重引用符 ("") で囲む必要があります。そうしない場合、エラー 6135 (constant expression type error) が返されます。LITERALフィールドでは算術演算は使用できません。 -
distance関数などの特殊機能関数をfilter句で使用することができます。 -
LITERAL型フィールドの場合、フィルタリングでは=(等しい) および!=(等しくない) 演算子のみが使用できます。>や<などの関係演算子は使用できません。LITERALフィールドはトークン化されないため、完全一致が必要です。 -
inおよびnotin演算子は、フィールド値が指定されたリストに存在するかどうかを確認します。これらの演算子は、INT、LITERAL、FLOAT、DOUBLE型に対応しています。ARRAY、TEXT、またはあいまいなトークン化の型には対応していません。詳細については、「in および notin」をご参照ください。 -
TEXTやSHORT_TEXTなどのトークン化されたフィールドは、プロパティフィールドとして設定できません。数値およびトークン化されていないフィールドのみがプロパティフィールドとして設定できます。対応している型には、INT、INT_ARRAY、FLOAT、FLOAT_ARRAY、DOUBLE、DOUBLE_ARRAY、LITERAL、LITERAL_ARRAYが含まれます。
関数の使用
-
distance:2 点間の球面距離を計算します。通常、位置情報サービス (LBS) で使用されます。
例:
位置 (120.34256, 30.56982) にいるユーザーから 10 km 圏内にある「Grandma's Home」という名前のレストランを検索します。lon フィールドと lat フィールドは店舗の経度と緯度を表し、ドキュメントに格納してプロパティフィールドとして設定しておく必要があります。
query=default:'Grandma's Home'&&filter=distance(lon,lat,"120.34256","30.56982") < 10000
-
in_polygon:ある点がポリゴン内にあるかどうかを確認します。通常、ある場所が配達エリア内にあるかどうかを判断するために使用されます。
例:
位置 (120.307234, 39.294245) にいるユーザーが、店舗の配達エリア内にいるかどうかを判断します。配達エリアは coordinates フィールドで定義されており、このクエリは、その配達エリアにユーザーの位置が含まれる店舗をフィルタリングします。
query=default:'food'&&filter=in_polygon(coordinates, 120.307234, 39.294245)>0
-
in_query_polygon:ドキュメントで指定された点が、クエリで指定されたポリゴン内にあるかどうかを確認します。
例:
Intime ショッピング地区内にある「Grandma's Home」レストランを検索します。この地区はポリゴン (xA,yA,xB,Yb,xC,Yc;xD,yD,xE,yE,xF,yF,xG,yG) で定義されます。店舗の位置は point フィールドに格納されます。
query=default:'Grandma's Home'&&filter=in_query_polygon("polygons",point)>0&&kvpairs=polygons:xA\,yA\,xB\,Yb\,xC\,Yc;xD\,yD\,xE\,yE\,xF\,yF\,xG\,yG
-
bit_struct:
INT_ARRAYフィールドに対してカスタムのグループ化を行い、グループ化された値に対して指定された操作を実行します。
例:
特定の時間帯に営業している店舗を検索します。ドキュメントには open_time という名前の int64_array フィールドが含まれており、各値は営業時間の範囲を表します。int64 値の上位 32 ビットが開始時刻を、下位 32 ビットが終了時刻を表します。14:00 から 15:30 まで営業している店舗を検索するには、時刻を同日の 00:00 からの分単位の間隔に変換します。14:00 から 15:30 までの期間は (840, 930) として表されます。
filter=bit_struct(open_time, "0-31,32-63","overlap,$1,$2,840,930")!=-1
-
fieldlen:
LITERAL型フィールドの長さを返します。
例:
usr_name フィールドが空ではないドキュメントを返します。
query=default:'keyword'&&filter=fieldlen(usr_name)>0
-
in/notin:フィールド値が指定されたリストに存在するか、または存在しないかを確認します。
例:
iphone を含み、INT 型の type フィールドの値が 1、2、または 3 であるドキュメントを検索します。
query=default:'iphone'&&filter=in(type, "1|2|3")
iphone を含み、INT32 型の type フィールドの値が 1、2、または 3 ではないドキュメントを検索します。
query=default:'iphone'&&filter=notin(type, "1|2|3")
-
multi_attr:配列フィールドの指定された位置の値を返します。
例:
製品には、市場価格、割引価格、販売価格など、複数の価格があり、price 配列フィールドに格納されます。次のクエリは、販売価格が 1,000 未満の携帯電話を検索します。
query=default:'mobile phone'&&filter=multi_attr(price,2)<1000
例
-
アプリケーションには
categoryという名前のint32フィールドがあり、値は 1 (ニュース) や 2 (掲示板) などの異なるカテゴリを表します。次のクエリは、「東京」を含み、カテゴリ 2 (掲示板) に属するドキュメントを検索します。query=default:'東京' AND category_search:'2' // category フィールドに対して category_search という名前のインデックスフィールドが作成されました。 // または query=default:'東京'&&filter=category=2 -
書籍検索アプリケーションは、
tagsという名前のLITERAL_ARRAYフィールドを使用して、「時代劇」、「サスペンス/ホラー」、「恋愛」などのジャンルタグを格納します。次のクエリは、「本能寺の変」を含み、「時代劇」タグを持つドキュメントを検索します。query=default:'本能寺の変'&&filter=tags="時代劇" -
E コマースアプリケーションには、
hit(クリック数) のint32フィールド、sale(販売数) のint32フィールド、およびcreate_timeのint64フィールドがあります。次のクエリは、「dress」を含み、(販売数とクリック数) の合計にrate(オフセット率) を乗じた値が 10,000 を超え、作成時刻が 1402345600 より前のドキュメントを検索します。query=default:'dress'&&filter=(hit+sale)*rate>10000 AND create_time<1402345600