テキストの意味検索は内部的にはベクトルデータの類似検索を行います。ベクトルデータにインデックスが指定されていない場合、テキストの意味検索のたびにすべてのベクトルデータをスキャンします。テキストの意味検索でインデックスが使用されているかは、pgx_similarity_search_checking_indexを実行することで確認できます。
例) テキスト意味検索でインデックスが使用されているかを確認する例
rag_database=> SELECT * FROM pgx_similarity_search_checking_index('sample_embeddings'::regclass, 'text for search', 5, '<=>'); ERROR: opclass of index is vector_ip_ops, but the distance_operator is <+>
pgx_similarity_search_checking_indexを実行し、検索結果が出力された場合は、インデックスが使用されています。上記のようにエラー終了した場合、インデックスの定義で指定した距離演算子と意味検索で指定する距離の種類が異なっている可能性があります。意味検索で指定する距離の種類が誤っている場合は指定する距離を修正してください。インデックスの定義で指定した距離演算子が誤っている場合は、インデックスを削除し正しいインデックスを再作成します。
ベクトル用のインデックスはベクトル変換の定義時によって内部的に作成されるベクトルを格納するテーブルに対して明示的に定義します。
例) ベクトルテーブルのインデックスを変更する例
-- 古いインデックス名を確認し削徐 rag_database=> SELECT indexname FROM pg_indexes where tablename = 'sample_embeddings_store'; indexname ------------------------------------------ sample_embeddings_store_pkey sample_embeddings_store_id_chunk_seq_key sample_embeddings_store_embedding_idx - embeddingというカラムに対して作成されています。 (3 rows) rag_database=> DROP INDEX sample_embeddings_store_embedding_idx -- 正しいインデックスの追加 rag_database=> CREATE INDEX ON sample_embeddings_store USING hnsw (embedding vector_l1_ops);