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

:bit_struct

最終更新日:Aug 22, 2026

このプラグイン関数をフィルター句で使用してデータをフィルタリングします。数値を返す関数は、ソート句でデータをソートするために使用できます。関数パラメーターとして使用するドキュメントフィールドは、インデックスまたはプロパティとして作成する必要があります。

機能

1. 概要

bit_struct:INT 配列型フィールドの各値をビット位置に基づいてカスタムセグメントに分割し、これらのセグメントに対して指定のオペレーションを実行します。

2. 構文

bit_struct(doc_field,"$struct_definition", operation,...)

3. パラメーター

  • doc_field:INT 配列型のフィールド名です。

  • $struct_definition:int64 の値を複数の次元に分割します。各次元は、開始ビット位置と終了ビット位置をハイフン (-) で区切って定義します。ビット位置はゼロインデックスで、最上位ビットから数えます。ビット位置の範囲は 0~63 です。複数の次元を定義する場合は、カンマ (,) で区切ります。各次元には 1 から始まる番号が割り当てられます。たとえば、int64 の値を 3 つの次元に分割し、ビット 0~9 を 1 つ目の値 ($1)、ビット 10~48 を 2 つ目の値 ($2)、ビット 49~60 を 3 つ目の値 ($3) として表すには、このパラメーターを "0-9,10-48,49-60" に設定します。

  • operation:実行するオペレーションを定義します。少なくとも 1 つ、最大 5 つのオペレーションを定義する必要があります。各オペレーションには、$struct_definition で使用した最後の番号から増分する番号が割り当てられます。複数のオペレーションを定義する場合、後のオペレーションは、割り当てられた番号を参照して前のオペレーションの戻り値を使用できます。使用可能なオペレーションは次のとおりです:

    • "equal,$m,$n":$m が表す値が $n が表す値と等しいかどうかを確認します。等しい場合は true を返し、それ以外の場合は false を返します。

    • "overlap,$m,$n,$k,$p":数直線上で、($m, $n) で定義される範囲が、($k, $p) で定義される範囲と重なっているかどうかを確認します。重なっている場合は true を返し、それ以外の場合は false を返します。

    • "and,$m,$n,...":$m、$n などに対する論理 AND (&&) の結果を返します。

4. 戻り値

int64 の値です。この関数は、最終オペレーションが true と評価される、doc_field の最初の要素のゼロベースインデックスを返します。doc_field 内のどの要素も指定のオペレーションを満たさない場合、この関数は -1 を返します。

5. 注意事項

  • 関数パラメーターに依存するフィールドは、プロパティフィールドとして作成する必要があります。

使用シナリオ

特定の時間帯に営業している店舗はどれですか? ドキュメントに int64 配列型の open_time という名前のフィールドがあり、各値が営業時間の期間を表しているものとします。int64 の値の上位 32 ビットは開始時刻を表し、下位 32 ビットは終了時刻を表します。14:00~15:30 に営業している店舗を検索するには、この時間範囲を 1 日の開始時刻 (00:00) からの経過分数に変換できます。たとえば、14:00~15:30 の時間範囲は (840, 930) として表されます。クエリ内のフィルター句は次のように記述できます:

filter=bit_struct(open_time, "0-31,32-63","overlap,$1,$2,840,930")!=-1
  • 特定の日付に、特定の食事で Pmin~Pmax 人のグループに対応できる店舗を検索します

ドキュメントに book_info という名前の int64 配列型のフィールドがあるものとします。この配列の各値では、ビット 0~7 が日付、ビット 8~15 が食事タイプ、ビット 16~41 が最小人数、ビット 42~63 が最大人数を表します。明日 (日付 1) のディナー (食事タイプ 3) で 3~5 人のグループに対応できる店舗を検索するには、フィルター句を次のように記述できます:

filter=bit_struct(book_info,"0-7,8-15,16-41,42-63",
"equal,$1,1","equal,$2,3","overlap,$3,$4,3,5","and,$5,$6,$7")!=-1
// 説明
// $1 は book_info のビット 0~7 の値を表します。
// $2 は book_info のビット 8~15 の値を表します。
// $3 は book_info のビット 16~41 の値を表します。
// $4 は book_info のビット 42~63 の値を表します。
// $5 はオペレーション "equal,$1,1" の戻り値を表します。
// $6 はオペレーション "equal,$2,3" の戻り値を表します。
// $7 はオペレーション "overlap,$3,$4,3,5" の戻り値を表します。
// この関数は、$5、$6、$7 が表す値の論理 AND が初めて true になる、book_info 配列のインデックスを返します。
  • 14:00~15:30 の間 (間隔 (840, 930) に対応) に在庫数が 10 を超える店舗を検索します。 bit_struct 関数はインデックスを返すため、multi_attr 関数と組み合わせて、そのインデックスにある別の配列型フィールドの値を取得できます。たとえば、クエリ文では次のように使用できます:

filter=multi_attr(store, bit_struct(dispatch_time,"0-31,32-63", "overlap,$1,$2,840,930"))>10
// 説明
// dispatch_time は、マーチャントの配達時間を格納するドキュメント内の複数値の INT64 型フィールドです。時刻を、1日の開始時刻 (00:00) からの経過分数で表される期間に変換します。14:00~15:30 の期間は (840, 930) として表されます。
// store は int64 配列型のフィールドで、各値が dispatch_time の期間に対応し、その期間の在庫レベルを表します。

int64 配列型の値の構築

この例では、Python を使用して 8:00~18:00 の時間帯に対応する int64 の値を構築します。

# 開始時刻 8:00 (分単位)
start=8*60

# 終了時刻 18:00
end=18*60

# int64 の上位 32 ビットを開始時刻に、下位 32 ビットを終了時刻に使用します。
# まず上位 32 ビットを構築します。
start=start<<32
print("High 32 bits",start) #2061584302080

# 最終結果
result=start|end
print("Result",result) #2061584303160

結果:2061584303160

次に、簡単な例を示します。

配列に特定の値が含まれているかどうかを確認するとします。この値は要素の下位 32 ビットに格納されています。フィルター句は次のように記述できます:

bit_struct(type_arr,"0-31,32-63","equal,$2,40506")!=-1
// 説明:
// "0-31,32-63": これは固定値です。
// "equal,$2,40506": 配列の要素の下位 32 ビット ($2) が値 40506 と等しいかどうかを確認します。