Redis は、文字列、ハッシュ テーブル、リスト、セット、順序付きセットなどを含む豊富な関数とデータ構造を提供する高性能 NoSQL データベースです。さらに、Redis は、パブリッシュとサブスクライブ、Lua スクリプト、トランザクションなどの高度な機能も提供します。中でも、Redis の分散検索機能は非常に実用的で、大量のデータを迅速に取得するのに役立ちます。この記事では、Redis が分散検索機能を実装する方法を検討し、具体的なコード例を示します。
1. Redis の分散検索機能の概要
Redis は、全文検索と特定の属性に基づくスキャンという 2 つの分散検索機能を提供します。ここではまず、これら 2 つの機能の概念と実装方法を見ていきます。
1. 全文検索
全文検索とは、テキスト データ内の特定の文字列を検索することを指します。 Redis では、Redisearch プラグインを使用して全文検索機能を実装できます。 Redisearch は、逆索引を使用して検索を実装します。つまり、最初に各文書を用語に分割し、次に各用語と文書番号の間のマッピング関係を確立し、最後にすべての用語の逆索引テーブルを作成します。検索するときは、逆引きインデックス テーブルでクエリ対象の用語を検索するだけで済みます。
Redisearch は、検索時にワイルドカードおよびあいまい検索をサポートし、「AND」や「OR」などの論理演算もサポートします。検索結果は、特定のルールに従って並べ替えることも、結果の一部のみが返されるように指定することもできます。
2. 属性ベースのスキャン
属性ベースのスキャンとは、複数の属性を持つデータ コレクション内の 1 つまたは一部の属性に基づいて、条件を満たすデータをフィルターで除外することを指します。 Redis では、RedisGears と Redisearch を使用してこの機能を実現できます。
RedisGears は Redis によって管理されているプラグインで、Redis のキーと値のペアをストリームに変換する機能を提供します。 RedisGears を使用していくつかのストリームを作成し、Redisearch の「FT.AGGREGATE」コマンドを使用してこれらのストリームを集約することもできます。集約後、データをフィルター処理して並べ替えることができ、Redis の他のデータ構造に出力したり、ネットワーク経由で送信したりすることもできます。
2. Redis の分散検索機能の具体的な実装
ここでは全文検索を例に分散検索機能を実装します。 redisearch-py を Python クライアントとして使用し、2 つのノードで Redis インスタンスをシミュレートします。この例では、2 つの Redis インスタンスのそれぞれにインデックスを作成して検索します。
1. 依存関係をインストールします
redisearch-py ライブラリをインストールします:
pip install redisearch
2. Redis インスタンスを構築します
まず、2 つの異なるポートで 2 つの Redis インスタンスを起動する必要があります。ここでは Redis の公式イメージを使用し、ポートパラメーターを変更して 2 つのインスタンスを作成します。
$ docker run -d -p 6380:6379 redis
$ docker run -d -p 6381:6379 redis --port 6379
3. インデックスの作成
redisearch-py (redisearch-py のメイン インターフェイス) の RediSearch オブジェクトを使用して 2 つのフルテキスト インデックスを作成します。ここでは「FT.CREATE」コマンドを使用しました。
from redisearch import クライアント、クエリ、テキストフィールド、数値フィールド
client1 = クライアント('インデックス1'、ポート=6380)
クライアント2 = クライアント('インデックス2'、ポート=6381)
client1.create_index((TextField('title',weight=5.0), TextField('content')))
client2.create_index((TextField('title',weight=5.0), TextField('content' )))
ここでは、タイトルとコンテンツという 2 つのフィールドを定義します。このうち、タイトルの重みは5.0、コンテンツの重みはデフォルト値の1.0であり、タイトルの重要性が高いことを示している。これら 2 つのフィールドを使用して、検索クエリを照合できます。
4. データの追加
後続の検索操作を容易にするために、2 つのインデックスにデータを追加します。ここでは、「FT.ADD」コマンドを使用してデータを追加するだけです。
client1.redis.execute_command('FT.ADD', 'idx1', 'doc1', 1.0, 'FIELDS', 'title', 'これはタイトルです', 'content', 'ここにあります一部のコンテンツ')
client1.redis.execute_command('FT.ADD', 'idx1', 'doc2', 1.0, 'FIELDS', 'title', 'タイトルは重要です', 'コンテンツ', 'コンテンツはそれほど重要ではありません')
client2.redis.execute_command('FT.ADD', 'idx2', 'doc1', 1.0, 'FIELDS', 'title', 'これはタイトルです', 'content ', 'ここにコンテンツがあります')
client2.redis.execute_command('FT.ADD', 'idx2', 'doc2', 1.0, 'FIELDS', 'title', 'タイトルは重要です', 'content '、'コンテンツはそれほど重要ではありません')
ここでは 2 つのドキュメントを追加しました。各ドキュメントにはタイトルとコンテンツという 2 つのフィールドがあります。
5. データの検索
RediSearch オブジェクトを使用して、検索コマンドを実行します。ここでは「FT.SEARCH」コマンドを使用して検索し、クエリ文字列と検索するインデックスを指定します。
result1 = client1.search('content')
result2 = client2.search('content')
ご覧のとおり、2 つの結果セットは 2 つの異なるインデックスから取得されています。 。
6. 結果を表示します
最後に、Python の pprint ライブラリを使用して結果を出力します:
from pprint import pprint
pprint(result1)
pprint(result2)
実行結果は次のとおりです:
{'docs': [{'content': 'ここにコンテンツがあります', 'title': 'これはタイトルです', 'id': 'doc1'}], 'total_results': 1, 'カーソル': 0, 'total_pages': 1}
{'docs': [{'content': 'ここにコンテンツがあります', 'title': 'これはタイトルです', 'id': 'doc1'} ], 'total_results': 1, 'cursor': 0, 'total_pages': 1}
両方の検索結果に、「ここにコンテンツがあります」というドキュメントが含まれていることがわかります。
3. 概要
この記事では、Redis の分散検索機能を紹介し、全文検索のコード例を示しました。分散検索を実装する場合、Redisearch と RedisGears という 2 つのプラグインを使用し、Redis 用にクラスターを構成する必要があります。
Redis の分散検索機能は、大量のデータを迅速に取得できるだけでなく、単一障害点を回避し、システムの可用性を向上させます。この記事を学習することで、Redis の分散検索機能についてより深く理解できると思います。
以上がRedis が分散検索機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。