Redisには私のプロジェクト (webapp のオートコンプリート バックエンド) に非常に優れた機能があることがわかりました。基本的に、それは私の全文検索エンジンです。データセット全体をメモリに保持できないため、Redis の代替品を探しています。
次のように Redis ストアを作成します (このアイデアのクレジットへのリンクが見つかりません)。
- 通常のデータベースからの(重み付けされた)アイテムを、各文字の後に3文字のチャンクにチャンクします(「単語」->
['wor', 'ord', 'rds']
) - すべてのチャンクは、そのようなチャンクを持つアイテムの id-s のソートされたリストを保持するためのキーになります。(
ZADD chunk weight items_id
) - すべてのアイテム ID は、アイテムに関する単純な JSON ドキュメントを保持するためのキーでもあります (
SET items_id items_hash_in_json
)
検索は次のように機能します。
- クエリ文字列は同じように 3 文字のチャンクに作成されます
- 私はそれらすべてのチャンクの交差を求め、items_id-s のリストを取得します ( と の
ZINTERSTORE
組み合わせZRANGEBYSCORE
) - items_id-s ごとに JSON ドキュメントのリストを返す
簡潔でシンプル。非常に効果的で高速です。このようなフローにはまだいくつかの小さな短所がありますが、ほとんどの場合、自分のドメインに適切なツールと適切なデータ型があると感じています。
主な問題は、メモリが多すぎることです。データベースに約 600K のアイテムがあり、「インデックス作成」で 40 文字後にそれらを削減しましたが、それでも 2.5GB の RAM が必要です。タスクには少し多めです。そして、データセットは、多すぎず、速すぎず、成長し続けます。
現在、いくつかの NoSQL ストアを調べましたが、Redis と同様のアプローチやツールに出会っていません。多分それは私が今すべての仕事をハンマーで見ているからかもしれませんが、他のNoSQLストアでは、そのような機能を自分で実装する必要があると感じています(ソートされたリスト、それらの交差を見つける、バイナリ文字列としての単純なキー値、データの挿入は非常に単純、単純ですプロトコル/API および単純なクライアント)。
Perl バインディングも必要ですが、非常に単純なプロトコル (CoachDB の REST など) の場合は必須ではありません。
他の NoSQL 製品で私のソリューションを実装するためのそのようなツールを知っていますか?
他の目で、私はすでに完全に異なるソリューションも探しています ( couchdb-lucene のようなものですが、上記で説明したシステムの放棄は避けたいと思います。