2025/06/05 18:37 I made a search engine worse than Elasticsearch (2024)

ロボ子、今日はSearchArrayをPandasに追加して、Elasticsearchと比較した実験結果について話すのじゃ。

興味深いですね、博士。SearchArrayをPandasに追加するとは、どのような発想から生まれたのでしょうか?

これは、Pandasに全文検索機能を追加するサイドプロジェクトらしいのじゃ。名付けてSearchArray!

なるほど。それで、Elasticsearchと比較したのですね。どのようなベンチマークを使ったのですか?

質問応答に特化した情報検索ベンチマーク、BEIRを使ったらしいぞ。MSMarco Passage Retrievalコーパスという800万件のドキュメントで比較したそうだ。

800万件ですか!結果はどうでしたか?

NDCG@10という指標では、Elasticsearchが0.2275、SearchArrayが0.225で、ほぼ同等だったらしいのじゃ。

ほぼ同等!すごいですね。でも、スループットはどうだったんですか?

そこがミソじゃ。検索スループットはElasticsearchが90 QPSに対して、SearchArrayは約18 QPS。インデックス作成スループットはElasticsearchが10K Docs Per Secに対して、SearchArrayは約3.5K Docs Per Secだったそうだ。

結構差がありますね。原因は何だったのでしょう?

ElasticsearchはWANDアルゴリズムを使っているのが大きいぞ。スコアリングの高い上位N件の結果を効率的に取得できるのじゃ。

WANDアルゴリズムですか。初めて聞きました。

複数の検索語を含むクエリで、スコア計算が不要な部分を省略して、上位N件の結果を効率的に取得するアルゴリズムのことじゃ。SearchArrayはすべてのドキュメントに対してBM25スコアリングを行って、単純にスコアを合計しているからの。

なるほど。他に違いはありますか?

SearchArrayは転置インデックスを直接保持せず、フレーズマッチングのために位置インデックスを使っている点も影響しているのじゃ。あと、term frequencyを計算するためにpopcountを使っているが、Elasticsearchに比べて最適化が不十分らしい。

位置インデックスですか。フレーズマッチングには良さそうですが、スループットには影響がありそうですね。

その通り!それに、SearchArrayはクエリ全体のキャッシュを行わず、BM25スコアの計算ロジックを外部で実装する必要があるのもネックじゃな。

色々と最適化の余地がありそうですね。

結論としては、SearchArrayはプロトタイピングツールであり、大規模な検索システム構築には向かないということじゃ。Elasticsearchなどの大規模検索エンジンは、異なるトレードオフに基づいて最適化されているからの。

勉強になります。SearchArrayは手軽に試せるのが魅力ですね。

そういうことじゃ。ところでロボ子、SearchArrayを使って、私のおやつを検索してみてくれんかの?

博士のおやつですか?承知いたしました。…検索結果、おやつは一つも見つかりませんでした。全部食べちゃったんですね!

な、なんですってー!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。