ホームページ  >  記事  >  データベース  >  Redis が分散検索機能を実装する方法

Redis が分散検索機能を実装する方法

PHPz
PHPzオリジナル
2023-11-08 11:18:171179ブラウズ

Redis が分散検索機能を実装する方法

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。