FT.SEARCH

FT.SEARCH 使用提供的查询搜索索引,并返回指定的值。

如需详细了解查询语法,请参阅查询语法

语法

FT.SEARCH index query
  [NOCONTENT]
  [TIMEOUT timeout]
  [PARAMS nargs name value [ name value ...]]
  [LIMIT offset num]
  DIALECT 2
  • index(必需):您要查询的索引。
  • query(必需):这是您的查询内容。如需详细了解查询语法,请参阅查询语法
  • NOCONTENT(可选):此方法仅返回文档 ID,并排除内容。
  • TIMEOUT(可选):允许您为搜索命令设置超时值。
  • PARAMS(可选):键值对的数量乘以 2。
  • [LIMIT offset num](可选):可让您选择具有偏移量和数字计数的分页。如果您不使用此参数,则默认为 LIMIT 0 10,最多返回 10 个键。
  • DIALECT 2(可选):指定您的方言。唯一受支持的方言是方言 2。

命令返回

  • 此命令会返回数组或错误消息。返回的数组的元素表示最匹配的查询结果。每个数组元素均包含以下信息:

  • 条目哈希键

  • 包含下列各项的数组:

    • 键值:[$score_as ] score_value
    • 距离值
    • 属性名称
    • 矢量值

    如果使用 NOCONTENT,则数组元素仅包含文档 ID。

示例

对于本示例,假设您在哈希字段 Vec 上创建了 HNSW 索引。假设您已经添加了一些包含以下字段名称的 Hash 条目,并且想要找到与给定输入向量最匹配的向量。

哈希字段名称:

  • Vec - 字段值包含实际矢量。
  • some_hash_key - 一些关联的矢量元数据。

如需运行搜索,请使用 FT.SEARCH 命令:

FT.SEARCH idx "*=>[KNN 3 @vec $BLOB EF_RUNTIME 40 AS score]" PARAMS 2 BLOB
"\x12\xa9\xf5\x6c" DIALECT 2

返回数组:

[3, b'key_192', [b'__embedding_score', b'0.061539709568', b'embedding', b'd\xdeA?\xb7\\xbb>!\xb3\xd8>0\x94n?\xbd\xbco=WX\xe4>kN\x9e>\x1aV0>Z\x92*?\rD\x04>', b'some_hash_key', b'some_hash_key_value_192'], b'key_209', [b'__embedding_score', b'0.0803312063217', b'embedding', b's\xe1W?\xa4\x1d\xad>\xb8\x99Q?\xa9u ?6\xc8\xb2>=j5?!\x13\x96>~\x13\xb9=\xebcX?\x92\x86\xb8>', b'some_hash_key', b'some_hash_key_value_209'], b'key_821', [b'__embedding_score', b'0.0615693926811', b'embedding', b')\x1e\x03?\xa6\x10\xe0>^-\xa1\x00\x87>\x18u\xa2=\x06\xa2;>,\xeb=?\x0e%\xa4>', b'some_hash_key', b'some_hash_key_value_821']]

Nodejs 示例

const Redis = require("ioredis");
const redis = new Redis();
const searchResult = await redis.call("FT.SEARCH", "idx", "*=>[KNN 3 @vector $BLOB EF_RUNTIME 40 AS score]", "PARAMS", "2", "BLOB", "\x00\x00\x00\x00", "DIALECT", "2");
console.log(searchResult);