OpenSearchでplugins.security.disabled=trueが効かない

OpenSearch 2.11あたりからplugins.security.disabled=trueを指定しているけど、効かない感じがするな…と思ったら、無効にする方法が変わっていた。なので、DISABLE_SECURITY_PLUGIN=trueに変える必要がある。

それに加えて、デモ用の設定が入ってしまうので、DISABLE_INSTALL_DEMO_CONFIG=trueというのも環境変数で指定してあげる必要がある。

ベクトル検索の性能比較一覧

codelibs/search-ann-benchmark でANNでのベクトル検索プロダクトの性能を確認できるようにしているけど、GitHub Actionsで実行している結果をここで一覧できるようにしました。GitHub Actionsで実行した結果を一日一回収集して、そのページにまとめて簡単に確認できるようにした感じです。

上位10件と上位100件を取得した場合の平均応答時間と精度になります。ここで言う精度というのは、近似的な近傍検索なので、上位K件が期待するものとは限らないので、厳密な距離計算をしたときに得られるK件と比較してどれだけ一致しているか?というPrecision@Kの値です。10件取得して、正解と9件しか一致していなければ、0.9のようになります。

応答速度と精度のバランスが取れるように各種設定を調整していますが、実行しているコードはGitHubに置いてあるので、より良い値があれば、プルリクなどいただければと思います。一応、HNSWで統一してあるので、mやefなどのパラメーターは一緒にしてあります。

Qdrantが安定して、速さを保っている感じで、ElasticsearchやOpenSearchのLucene系は着実に追い上げてきている感じです。ただ、Lucene系は取得件数が多くなると、他と比べて、応答速度の劣化が大きいです。PGVectorは量子化対応されないと、応答時間での差は埋めるのはしばらく難しい気がします。

という感じで、ベクトル検索まわりの調査等々をしてきて、いろいろと知見はあるので、何かあれば、CodeLibs, Inc.までご相談いただければと。

opensearchpyでtimeoutが使えない

opensearchpyのドキュメントにはtimeoutを引数で渡せると書いてあるけど、使えないのを忘れてハマるので、メモ的に残す。

このIssueにもあるように、

client.search(..., timeout=120)

みたいにすると、

opensearchpy.exceptions.ConnectionError: ConnectionError(Timeout value connect was 120, but it must be an int, float or None.) caused by: ValueError(Timeout value connect was 120, but it must be an int, float or None.)

みたいな感じで、Errorが発生する。timeoutを指定したい場合は

client.search(..., params={"timeout":120})

のような感じで、paramsで渡せば指定できる。