クエリ構文

ベクトルクエリは、ベクトル データベースを検索して、クラスタ全体でクエリベクトルに最も一致するベクトルを見つけることで動作します。このページでは、その仕組みについて詳しく説明します。

類似ベクトルを見つける

ベクトル検索クエリでは、次の 2 つの戦略が使用されます。

  • K 最近傍法(KNN): クエリベクトルに最も近い k 個のベクトルを検索します。
  • 近似最近傍探索(ANN): クエリベクトルに近似的に最も近い k 個のベクトルを検索します。

KNN を使用するには、FLAT ベクトル インデックス タイプでインデックスを作成する必要があります。KNN では、検索クエリは正確ですが、速度は遅くなります。ANN を使用するには、HNSW ベクトル インデックス タイプでインデックスを作成する必要があります。ANN を使用すると、検索クエリは近似になりますが、高速になります。ANN の精度は、クエリで HNSW インデックス パラメータと EF_RUNTIME パラメータを調整することで向上させることができます。

クエリ構文の内訳

FT.SEARCH index "(hybrid_filter_expression)=>[KNN num_neighbours @my_vector_hash_key $my_vector_query_param]" PARAMS 2 my_vector_query_param "query_embedding" DIALECT 2
  • index: ベクトル フィールドを含むインデックスの名前。

  • (hybrid_filter_expression): ハイブリッド フィルタ式。フィルタ式では、タグと数値のインデックスのみがサポートされています。フィルタ式について詳しくは、ハイブリッド クエリをご覧ください。

    • (*) は、フィルタリングを必要としないクエリを実行するために使用できます。
  • =>: フィルタをベクトル検索式から分離します。

  • [KNN num_neighbours @field $vector]: KNN 検索式。num_neighbors は選択した結果の数に、@field はベクトル フィールドの名前に置き換えます。

  • PARAMS 2 my_vector_query_param "query_embedding":

    • PARAMS の後の値 2 は、2 つの追加の引数を指定する必要があることを示します。
    • my_vector_query_param は、KNN 検索式で指定されたクエリ パラメータ ベクトル名です。
    • query_embedding は、埋め込みクエリ ベクトルに置き換えます。
  • DIALECT 2: クエリ言語バージョン 2 以降を使用することを指定します(ベクトル検索に必要)。

ハイブリッド クエリ

かっこ()で囲まれた最初の式はフィルタ式です。フィルタ式を使用すると、ベクトル検索式の実行中にベクトルをフィルタリングできます。フィルタ式を使用して結果をフィルタするクエリは、ハイブリッド クエリと呼ばれます。タグ インデックスと数値インデックスの任意の組み合わせでハイブリッド クエリを形成できます。

Memorystore for Redis Cluster では、ベクトル検索式をフィルタリングするために次の 2 つの方法を使用します。

  1. 事前フィルタリング: 事前フィルタリングでは、セカンダリ インデックス(タグ、数値など)を使用して、ベクトル類似度に関係なく、最初にフィルタ式に一致するものを検索します。フィルタされた結果が計算されると、ブルート フォース検索が実行され、ベクトルの類似度で並べ替えられます。
  2. インライン フィルタリング: インライン フィルタリングは、フィルタに一致しないベクトルを無視して、ベクトル検索アルゴリズム(HNSW など)を実行します。

フィルタされた検索スペースが元の検索スペースよりもはるかに小さい場合、事前フィルタリングは高速になります。フィルタリングされた検索スペースが大きいほど、インライン フィルタリングは高速になります。Memorystore for Redis Cluster は、指定されたフィルタに基づいて 2 つの戦略を自動的に選択します。

フィルタ式は、タグ インデックスと数値インデックスの両方をサポートしています。

タグ インデックス

タグは、区切り文字で区切られたタグのリストとして解釈されるテキスト フィールドです。通常、タグは色、本のジャンル、都市名、著者など、可能な値が有限の小さな値のセットです。

  • タグフィルタとして使用できるのは、インデックス登録されたフィールドのみです。
  • タグ フィールドは、デフォルトでカンマ「,」である区切り文字でトークン化されますが、インデックスの作成時に構成できます。
  • タグ フィールドのインデックス登録時にステミングは行われません。
  • タグフィールドでは、プレフィックス フィルタと完全一致フィルタのみを実行できます。接尾辞、接中辞のクエリはサポートされていません。
  • デフォルトでは、タグは大文字と小文字が区別されません。たとえば、「Blue」と「BLUE」はどちらも「blue」としてインデックスに登録され、ハイブリッド クエリで同じ結果が返されます。
  • 空の文字列はインデックスに登録されず、クエリも実行されません。
  • インデックス登録とクエリの実行中に、末尾の空白文字は削除されます。
構文

ここで、{} は構文の一部であり、| は複数のタグをサポートする OR 演算子として使用されます。

@:{  |  | ...}

たとえば、次のクエリは、青、黒、緑のいずれかの色のドキュメントを返します。

@color:{blue | black | green}

別の例として、次のクエリは「hello world」または「hello universe」を含むドキュメントを返します。

@color:{hello world | hello universe}

数値インデックス

数値インデックスを使用すると、フィルタリング クエリで指定された開始値と終了値の間の値のみを返すことができます。

  • 包含クエリと除外クエリの両方がサポートされています。
  • 自由形式のクエリでは、+inf、-inf を使用して開始範囲と終了範囲を表すことができます。

たとえば、次のクエリは 2021 年から 2024 年(両端を含む)に出版された書籍を返します。同等の数式は 2021 <= year <= 2024 です。

"@year:[2021 2024]"

次のクエリは、2021 年(含まない)から 2024 年(含む)の間に出版された書籍を返します。同等の数式は 2021 < year <= 2024 です。

@year:[(2021 2024]

次のクエリは、2024 年以前に出版された書籍を返します(この年を含む)。同等の数式は year <= 2024 です。

@year:[(-inf 2024]

次のクエリは、2015 年より後に出版された書籍を返します(この年を含まない)。同等の数式は year >= 2015 です。

@year:[2015 +inf]

次の表は、数式を事前フィルタリング クエリにマッピングする際のガイドとして使用してください。

数式 フィルタ式
min <= field <= max @field:[min max]
min < field <= max @field:[(min max]
min <= field < max @field:[min (max]
min < field < max @field:[(min (max]
field => min @field:[min +inf]
field > min @field:[(min +inf]
field <= max @field:[-inf max]
field < max @field:[-inf (max]
field == val @field:[val val]

論理演算子

複数のタグと数値フィールドを使用して、論理演算子を使用した複雑なクエリを作成できます。

論理 AND

論理積を設定するには、述語の間にスペースを使用します。次に例を示します。

query1 query2 query3
論理 OR

論理 OR を設定するには、述語の間に「|」文字を使用します。次に例を示します。

query1 | query2 | query3
論理否定

各クエリの前に - を付加することで、任意のクエリを否定できます。否定クエリは、クエリに一致しないすべてのエントリを返します。これには、フィールドのないドキュメントも含まれます。

たとえば、@genre:{comedy} の否定クエリは、コメディ以外のすべての書籍と、ジャンル フィールドがないすべての書籍を返します。

次のクエリは、2015 年から 2024 年の間に出版されていない、または年フィールドがない「コメディ」ジャンルの書籍をすべて返します。

@genre:[comedy] -@year:[2015 2024]
論理演算子の組み合わせの例

論理演算子を組み合わせて、複雑なフィルタ式を作成できます。

次のクエリは、2015 年から 2024 年の間に出版されており、さらに(AND)、ジャンルが「コメディ」または「ホラー」の書籍をすべて返します。

@genre:[comedy|horror] @year:[2015 2024]

次のクエリは、ジャンルが「コメディ」または「ホラー」、もしくは(OR)、2015 年から 2024 年の間に出版されたすべての書籍を返します。

@genre:[comedy|horror] | @year:[2015 2024]

次のクエリは、2015 年から 2024 年の間に出版されており、さらに(AND)、ジャンル フィールドがないか、ジャンル フィールドが「コメディ」ではない書籍をすべて返します。

-@genre:[comedy] @year:[2015 2024]

使用方法については、FT.SEARCH の情報を参照してください。