Redisは、開発で非常に一般的に使用されるインメモリデータストレージミドルウェアであり、以前は基本的にインメモリストレージに使用されていました。最近、Redisが多くの拡張モジュールをリリースしたことを発見しました。たとえば、RedisJSONは、ネイティブJSONオブジェクトのストレージをサポートし、検索エンジンとしてRediSearchを使用し、中国語検索をサポートできます。本日は、RediSearch + RedisJSONを検索エンジンとして使用する方法をご紹介しますので、お役に立てば幸いです。
RedisModの概要
まず、Redis用の一連の拡張モジュールであるRedisModを紹介しましょう。RedisModのサポートにより、Redisの機能は非常に強力になります。現在、RedisModには次の拡張モジュールが含まれています。
- RediSearch:フル機能の検索エンジン。
- RedisJSON:JSONタイプのネイティブサポート。
- RedisTimeSeries:時系列データベースのサポート。
- RedisGraph:グラフデータベースのサポート。
- RedisBloom:確率的データのネイティブサポート。
- RedisGears:プログラム可能なデータ処理。
- RedisAI:機械学習のためのリアルタイムのモデル管理とデプロイ。
インストール
まず、すべてのRedisModを使用してRedisをインストールする必要があります。Dockerを使用してインストールすると非常に便利です。
- 次のコマンドを使用して、RedisModのイメージをダウンロードします。
docker pull redislabs/redismod:preview
- コンテナでRedisModサービスを実行します。
docker run -p 6379:6379 --name redismod \
-v /mydata/redismod/data:/data \
-d redislabs/redismod:preview
RedisJSON
RedisJSONモジュールを使用すると、RedisはネイティブJSONタイプのデータを保存できます。これにより、MongoDBと同様に、JSONのさまざまな属性に簡単にアクセスできます。ここでは、RedisInsightを使用してRedisを操作します。
- まず、JSONタイプのキーと値のペアといくつかの商品オブジェクトデータをJSON.SETコマンドを使用してRedisに追加します。JSONはツリー構造であるため、$記号を使用してJSONのルートノードへのデータの追加を表します。
JSON.SET product:1 $ '{"id":1,"productSn":"7437788","name":"小米8","subTitle":"全面屏游戏智能手机 6GB+64GB 黑色 全网通4G 双卡双待","brandName":"小米","price":2699,"count":1}'
JSON.SET product:2 $ '{"id":2,"productSn":"7437789","name":"红米5A","subTitle":"全网通版 3GB+32GB 香槟金 移动联通电信4G手机 双卡双待","brandName":"小米","price":649,"count":5}'
JSON.SET product:3 $ '{"id":3,"productSn":"7437799","name":"Apple iPhone 8 Plus","subTitle":"64GB 红色特别版 移动联通电信4G手机","brandName":"苹果","price":5499,"count":10}'
- データが正常に挿入されると、RedisInsightに次の情報が表示されます。JSONデータはフォーマットと強調表示をサポートしています。
- 次に、JSON.GETコマンドを使用してJSONタイプのキーと値のペアの値を取得できます。
JSON.GET product:1
- 値の指定されたプロパティのみを取得することもできます。RedisJSONでは、JSONオブジェクトでプロパティを取得するときに。から始める必要があります。
JSON.GET product:1 .name .subTitle
- JSON.TYPEコマンドを使用してJSONオブジェクトタイプを取得することもできます。
JSON.TYPE product:1 .
RediSearch
RediSearchモジュールを介して、Redisは強力な全文検索エンジンになり、中国語検索をネイティブにサポートします。以下でそれを体験してみましょう。
- RediSearchを使用してデータを検索する前に、まずインデックスを作成する必要があります。インデックス作成の構文は少し複雑です。最初に見てみましょう。
FT.CREATE {index}
[ON {data_type}]
[PREFIX {count} {prefix} [{prefix} ..]
[LANGUAGE {default_lang}]
SCHEMA {identifier} [AS {attribute}]
[TEXT | NUMERIC | GEO | TAG ] [CASESENSITIVE]
[SORTABLE] [NOINDEX]] ...
- FT.CREATEコマンドを使用して、インデックスを作成します。構文内のパラメーターの意味は次のとおりです。
- インデックス:インデックス名;
- data_type:インデックス作成用のデータ型。現在JSONまたはHASHをサポートしています。
- PREFIX:これにより、インデックスを作成する必要のあるデータプレフィックスを選択できます。たとえば、PREFIX 1 "product:"は、キーのproduct:のプレフィックスが付いたデータにインデックスが付けられることを示します。
- LANGUAGE:TEXTタイプ属性のデフォルト言語を指定します。これは、中国語を使用して中国語に設定できます。
- 識別子:属性名を指定します。
- attribute:属性エイリアスを指定します。
- TEXT | NUMERIC | GEO | TAG:これらはすべてオプションのタイプの属性です。
- SORTABLE:指定されたプロパティを並べ替えることができます。
- 文法を読んだ後は、理解しにくいかもしれません。以前の製品データに基づいてインデックスを作成してみてください。
FT.CREATE productIdx ON JSON PREFIX 1 "product:" LANGUAGE chinese SCHEMA $.id AS id NUMERIC $.name AS name TEXT $.subTitle AS subTitle TEXT $.price AS price NUMERIC SORTABLE $.brandName AS brandName TAG
- インデックスが確立されたら、FT.SEARCHを使用してデータを表示できます。たとえば、*を使用してすべてをクエリできます。
FT.SEARCH productIdx *
- 価格フィールドをSORTABLEに設定しているため、価格の降順で製品情報を返すことができます。
FT.SEARCH productIdx * SORTBY price DESC
- 返されるフィールドを指定することもできます。
FT.SEARCH productIdx * RETURN 3 name subTitle price
- brandNameをTAGタイプとして設定します。次のステートメントを使用して、ブランドがXiaomiまたはAppleである製品を照会できます。
FT.SEARCH productIdx '@brandName:{小米 | 苹果}'
- 価格はNUMERICタイプであるため、次のステートメントを使用して、価格が500〜1000の製品を照会できます。
FT.SEARCH productIdx '@price:[500 1000]'
- ファジークエリは、SQLのLIKEと同様に、プレフィックスで実行することもできます。これは*で表されます。
FT.SEARCH productIdx '@name:小米*'
- FT.SEARCHで検索キーワードを直接指定すると、すべてのTEXTタイプ属性でグローバル検索を実行でき、検索の下に黒いフィールドを含む製品などの中国語検索をサポートできます。
FT.SEARCH productIdx '黑色'
- もちろん、サブタイトルに赤いフィールドがある商品を検索するなど、検索フィールドを指定することもできます。
FT.SEARCH productIdx '@subTitle:红色'
- インデックスはFT.DROPINDEXコマンドで削除できます。DDオプションを追加すると、データも一緒に削除されます。
FT.DROPINDEX productIdx
- インデックスのステータスは、FT.INFOコマンドで表示できます。
FT.INFO productIdx
- RediSearchの検索構文はもっと複雑ですが、SQLと比較して使用できます。詳細については、次の表を参照してください。
Elasticsearchを比較する
Redisは、RediSearchとElasticsearchのパフォーマンス比較テストを正式に発表しました。ご覧ください。
インデックス機能
ウィキペディアからの560万(5.3GB)のドキュメントのインデックス作成、RediSearchは221秒、Elasticsearchは349秒、RediSearchは58%高速でした!
クエリ機能
データのインデックスが作成された後、32個のクライアントを使用して2つの単語を取得します。RediSearchのスループットは12.5K ops /秒に達し、Elasticsearchのスループットは3.1Kops/秒になります。RediSearchはElasticsearchの4倍の速度です。同時に、RediSearchの遅延は8ミリ秒ですが、Elasticsearchの遅延は10ミリ秒であり、RediSearchの遅延はわずかに短くなっています。
要約する
長年の開発の後、Redisはますます強力になり、キャッシュツールであるだけでなく、データベースのようなものになっています。RediSearchは、検索機能を実装するための別のオプションを提供し、パフォーマンスも非常に優れています。検索関連の機能を実行している場合は、それを検討することができます。