クエリ構文

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

類似ベクトルの検索

ベクトル検索クエリでは、次の 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 Valkey では、ベクトル検索のフィルタリングに次の 2 つの方法を使用します。

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

フィルタリングされた検索スペースが元の検索スペースよりもはるかに小さい場合、事前フィルタリングの方が高速です。フィルタされた検索スペースが大きいほど、インライン フィルタリングが高速になります。Memorystore for Valkey は、指定されたフィルタに基づいて 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

論理 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 年の間に出版された、ジャンル フィールドがない書籍、またはジャンル フィールドが「comedy」と等しくない書籍をすべて返します。

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

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