FT.SEARCH
は、指定されたクエリでインデックスを検索し、指定された値を返します。FT.SEARCH は、クエリされたノードだけでなく、クラスタ全体の結果を返します。
クエリ構文の詳細については、クエリ構文をご覧ください。
構文
FT.SEARCH index query [NOCONTENT] [TIMEOUT timeout] [PARAMS nargs name value [ name value ...]] [RETURN num field [AS alias] [ field [AS alias] ... ]] [LIMIT offset num] DIALECT 2
index
(必須): クエリを実行するインデックス。query
(必須): クエリ。クエリ構文の詳細については、クエリ構文をご覧ください。NOCONTENT
(省略可): ドキュメント ID のみを返します。コンテンツは除外されます。TIMEOUT
(省略可): 検索コマンドのタイムアウト値を設定できます。PARAMS
(省略可): Key-Value ペアの数に 2 を掛けた値。RETURN
(省略可): ドキュメントから取得するフィールドと、返される値のエイリアスを指定します。デフォルトでは、NOCONTENT
オプションが設定されていない限り、すべてのフィールドが返されます。設定されている場合は、フィールドは返されません。num が 0 に設定されている場合、NOCONTENT
と同じ動作をします。LIMIT
(省略可): オフセットと数値カウントを指定してページネーションを選択できます。このパラメータを使用しない場合、デフォルトはLIMIT 0 10
で、最大 10 個のキーが返されます。DIALECT 2
(省略可): 言語を指定します。サポートされている唯一の言語は言語 2 です。
コマンドの戻り値
このコマンドは、配列またはエラー メッセージを返します。返された配列の要素は、クエリの最も一致する結果を表します。各配列要素には次の内容が含まれています。
エントリ ハッシュキー
次の配列。
- キー値: [$score_as ] score_value
- 距離値
- 属性名
- ベクトル値
NOCONTENT
を使用する場合、配列要素はドキュメント ID のみで構成されます。
例 1: シンプルなベクトル検索クエリ
この例では、ユーザーがいくつかの特徴に基づいてプロパティを検索できるプロパティ検索インデックスを構築しているとします。次の属性を持つプロパティのリストがあるとします。
- 説明 - 特定のプロパティのベクトル エンベディング。
- その他のフィールド - 各プロパティには、他のメタデータも設定できます。ただし、わかりやすくするため、この例では他のフィールドは無視しています。
まず、FT.CREATE
コマンドを使用して、説明をベクトル フィールドとして HNSW インデックスを作成します。
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2
これで、HSET コマンドを使用していくつかのプロパティを挿入できます(インデックスの作成前に行うこともできます)。
HSET p1 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" HSET p2 description "\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00" HSET p3 description "\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00" HSET p4 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" HSET p5 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?"
これで、FT.SEARCH コマンドを使用してクエリを実行できるようになりました。次のクエリは、指定されたクエリベクトルに最も類似するプロパティを最大 5 つ返します。
FT.SEARCH idx "*=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
返された結果:
1) (integer) 5 2) p5 3) 1) __description_score 2) 1.6400001049 3) description 4) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80? 4) p4 5) 1) __description_score 2) 1.6400001049 3) description 4) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80? 6) p2 7) 1) __description_score 2) 1.6400001049 3) description 4) \x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00 8) p1 9) 1) __description_score 2) 1.6400001049 3) description 4) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80? 10) p3 11) 1) __description_score 2) 0.0399999953806 3) description 4) \x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00
コードサンプル
Python
# Before running, ensure you have installed redis-py: # pip install redis import redis client = redis.cluster.RedisCluster(host='your_server_host', port=6379) result = client.execute_command('FT.SEARCH', 'idx', '*=>[KNN 5 @description $query_vector]', 'PARAMS', '2', 'query_vector', '"\xcd\xccL?\x00\x00\x00\x00"', 'DIALECT', '2') print(result)
NodeJS
# Before running, ensure you have installed ioredis: # npm install ioredis const Redis = require("ioredis"); const redis = new Redis.Cluster([ { port: 6379, host: "your_server_host", }, ]); redis.call("FT.SEARCH", "idx", "*=>[KNN 5 @description $query_vector]", "PARAMS", "2", "query_vector", "\xcd\xccL?\x00\x00\x00\x00\x00\x00", "DIALECT", "2").then(result => { console.log(result); redis.disconnect(); });
CLI
# Before running, ensure you have install redis-cli redis-cli -h your_server_host -p 6379 FT.SEARCH idx "(*)=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
例 2: ハイブリッド クエリを使用したベクトル検索
この例では、city と price という 2 つの属性を追加して、ハイブリッド クエリを実行します。
- 説明 - 特定のプロパティのベクトル エンベディング。
- city - city の名前。
- price - プロパティの費用。
まず、説明をベクトル フィールド、city をタグフィールド、price を数値フィールドとしてインデックスを作成します。
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2 city TAG price NUMERIC
次に、いくつかのプロパティを挿入します(これはインデックスの作成前に行うこともできます)。
HSET p1 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" city "NEW YORK" price 500000 HSET p2 description "\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00" city "NEW JERSEY" price 400000 HSET p3 description "\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00" city "BANGALORE" price 60000 HSET p4 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" city "NEW YORK" price 600000 HSET p5 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" city "BANGALORE" price 75000
これで、クエリを実行できます。次のクエリは、指定されたクエリベクトルに最も類似するプロパティを最大 5 件返します。BANGALORE にあって、価格が 100,000 未満のもののみをフィルタします。
FT.SEARCH idx "(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
返された結果:
1) (integer) 2 2) p5 3) 1) __description_score 2) 1.6400001049 3) city 4) BANGALORE 5) price 6) 75000 7) description 8) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80? 4) p3 5) 1) __description_score 2) 0.0399999953806 3) city 4) BANGALORE 5) price 6) 60000 7) description 8) \x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00
フィルタクエリの形式の詳細については、クエリ構文をご覧ください。
コードサンプル
Python
# Before running, ensure you have installed redis-py: # pip install redis import redis client = redis.cluster.RedisCluster(host='your_server_host', port=6379) result = client.execute_command('FT.SEARCH', 'idx', '(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]', 'PARAMS', '2', 'query_vector', '"\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00"', 'DIALECT', '2') print(result)
NodeJS
# Before running, ensure you have installed ioredis: # npm install ioredis const Redis = require("ioredis"); const redis = new Redis.Cluster([ { port: 6379, host: "your_server_host", }, ]); redis.call("FT.SEARCH", "idx", "(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]", "PARAMS", "2", "query_vector", "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00", "DIALECT", "2").then(result => { console.log(result); redis.disconnect(); });
CLI
# Before running, ensure you have install redis-cli redis-cli -h your_server_host -p 6379 FT.SEARCH idx "(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2