Elasticsearchよりも高速RediSearch+RedisJSON=キングフライ

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は、検索機能を実装するための別のオプションを提供し、パフォーマンスも非常に優れています。検索関連の機能を実行している場合は、それを検討することができます。

おすすめ

転載: blog.csdn.net/Trouvailless/article/details/124272503