FT.SEARCH

FT.SEARCH menelusuri indeks dengan kueri yang diberikan, dan menampilkan nilai yang ditentukan. Perhatikan bahwa FT.SEARCH menampilkan hasil untuk seluruh cluster, bukan hanya node yang dikueri.

Untuk mengetahui detail tentang sintaksis kueri, lihat Sintaksis kueri.

Sintaks

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 (wajib): Indeks yang ingin Anda kueri.
  • query (wajib): Ini adalah kueri Anda. Untuk mengetahui detail tentang sintaksis kueri, lihat Sintaksis kueri.
  • NOCONTENT (opsional): Opsi ini hanya menampilkan ID dokumen, dan mengecualikan konten.
  • TIMEOUT (opsional): Memungkinkan Anda menetapkan nilai waktu tunggu untuk perintah penelusuran.
  • PARAMS (opsional): Jumlah pasangan nilai kunci dikalikan dua.
  • RETURN (opsional): Menentukan kolom yang ingin Anda ambil dari dokumen, beserta alias untuk nilai yang ditampilkan. Secara default, semua kolom akan ditampilkan kecuali jika opsi NOCONTENT ditetapkan, dalam hal ini tidak ada kolom yang ditampilkan. Jika num ditetapkan ke 0, perilakunya sama dengan NOCONTENT.
  • LIMIT (opsional): Memungkinkan Anda memilih penomoran dengan offset dan jumlah angka. Jika Anda tidak menggunakan parameter ini, defaultnya adalah LIMIT 0 10, yang menampilkan maksimal 10 kunci.
  • DIALECT 2 (opsional): Menentukan dialek Anda. Satu-satunya dialek yang didukung adalah dialek 2.

Pengembalian perintah

  • Perintah ini menampilkan array atau pesan error. Elemen array yang ditampilkan mewakili hasil kueri yang paling cocok. Setiap elemen array memiliki hal berikut:

  • Kunci hash entri

  • Array dari hal berikut:

    • Nilai kunci: [$score_as ] score_value
    • Nilai jarak
    • Nama atribut
    • Nilai vektor

    Jika NOCONTENT digunakan, elemen array hanya terdiri dari ID dokumen.

Contoh #1: Kueri penelusuran vektor sederhana

Untuk contoh ini, asumsikan kita sedang membuat indeks penelusuran properti tempat pelanggan dapat menelusuri properti berdasarkan beberapa fitur. Anggap kita memiliki daftar properti dengan atribut berikut:

  • Deskripsi - penyematan vektor untuk properti tertentu.
  • Kolom lainnya - setiap properti juga dapat memiliki metadata lainnya. Namun, untuk memudahkan, kolom lain diabaikan dalam contoh ini.

Awalnya, kita membuat indeks HNSW dengan deskripsi sebagai kolom vektor menggunakan perintah FT.CREATE:

FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2

Sekarang kita dapat menyisipkan beberapa properti (ini juga dapat dilakukan sebelum pembuatan indeks) menggunakan perintah 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?"

Sekarang kita dapat menjalankan kueri menggunakan perintah FT.SEARCH. Kueri berikut menampilkan hingga lima properti yang paling mirip dengan vektor kueri yang diberikan:

FT.SEARCH idx "*=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2

Hasil yang ditampilkan:

 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

Contoh Kode

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

Contoh #2: Penelusuran vektor dengan Kueri Hybrid

Untuk contoh ini, kita akan melakukan kueri campuran dengan menggunakan dua atribut tambahan bernama kota dan harga:

  • Deskripsi - penyematan vektor untuk properti tertentu.
  • Kota - nama kota.
  • Harga - biaya properti.

Awalnya, kita membuat indeks dengan deskripsi sebagai kolom vektor, kota sebagai kolom tag, harga sebagai kolom numerik:

FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2 city TAG price NUMERIC

Sekarang, kita dapat menyisipkan beberapa properti (ini juga dapat dilakukan sebelum pembuatan indeks):

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

Sekarang, kita dapat menjalankan kueri. Kueri berikut menampilkan hingga lima properti yang paling mirip dengan vektor kueri yang diberikan, yang hanya memfilter properti di BANGALORE dengan harga kurang dari 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

Hasil yang ditampilkan:

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

Lihat Sintaksis kueri untuk mengetahui detail tentang format kueri filter.

Contoh Kode

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