Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

RediSearch 2.0入門:データインデックス機能で実現する高速全文検索

RediSearch 2.0がパブリックプレビューとして公開されました。今回のメジャーリリースにおける多くの新機能は、ユーザーのフィードバックをもとに開発されており、開発者体験の向上とスケーラビリティの強化に重点が置かれています。本記事では、RediSearch 2.0の新しいデータインデックス機能と、より効率的なインデックス作成方法の基本を解説します。

Redisデータベース内に高機能なクエリおよび集計エンジンが組み込まれることで、キャッシュ用途をはるかに超えた、さまざまな新しいアプリケーションへの扉が開かれます。複雑なクエリでデータにアクセスする必要がある場合でも、Redisをプライマリデータベースとして使用でき、データの更新やインデックス管理のためのコードを追加する必要はありません。しかも、Redisならではの高速性・信頼性・スケーラビリティをすべて備えています。

新機能の詳細については、「Introducing RediSearch 2.0」をご覧ください。

はじめに

前提条件

RediSearch 2.0を使い始めるには、以下が必要です。

  • Docker
  • Redisコマンドラインインターフェイス。主な選択肢は次の2つです。
    • redis-cli(Redisに付属)
    • RedisInsight:Redisアプリケーション開発を効率化する無料のGUIツール。コマンドラインインターフェイスも含まれています。

RediSearchが有効なRedisデータベースを用意する

RediSearch 2.0は、さまざまな方法でインストールして利用できます。

  • Redis Enterprise Cloud
  • Redis Enterprise Software
  • RediSearchバイナリ
  • RediSearchソースコード
  • Dockerイメージ

ここでは簡単のため、Dockerイメージを使用します。(すでにRediSearch 2.0をインストール済みの方は、次のセクションへ進んでください。)DockerでRedisインスタンスを起動するには、ターミナルを開いて以下のコマンドを実行します。

> docker run -it --rm --name redis-search-2 \
   -p 6379:6379 \
   redis/redisearch:2.0.0

注: コンテナは終了時に自動的に削除されます(--rmパラメータ)。

Redisに接続してデータを挿入する

お好みのRedisクライアントを使って、RediSearchデータベースに接続します。

DockerでRedisインスタンスを起動した場合は、以下のコマンドでコンテナに組み込まれたredis-cliを使用できます。

> docker exec -it redis-search-2 redis-cli

RedisInsightを使いたい場合は、RediSearchインスタンスを追加してCLI画面に移動してください。

データの挿入

これでデータを挿入する準備が整いました。この例では、Redisハッシュとして保存された映画データを使用します。まずは数件の映画を挿入してみましょう。

> HSET movie:11002 title "Star Wars: Episode V - The Empire Strikes Back" plot "Luke Skywalker begins Jedi training with Yoda." release_year 1980 genre "Action" rating 8.7 votes 1127635

(integer) 6 

> HSET movie:11003 title "The Godfather" plot "The aging patriarch of an organized crime dynasty transfers control of his empire to his son." release_year 1972 genre "Drama" rating 9.2 votes 1563839 

(integer) 6

これでデータベースには2つのハッシュが格納されました。映画のキー(movie:11002など)がわかっていれば、以下のコマンドで簡単に情報を取得できます。

> HMGET movie:11002 title rating

1) "Star Wars: Episode V - The Empire Strikes Back"
2) "8.7"

しかし、タイトル、ジャンル、公開年などに基づいて映画のリストを検索したい場合はどうすればよいのでしょうか?

「コア」なRedisデータ構造だけの場合、たとえばジャンルと映画IDのリストを関連付けるためにセット(Set)を使って自前でインデックスを管理し、そのインデックスを運用・検索するためのコードを大量にアプリケーションへ追加する必要があります。

一方、RediSearchを使えば、データに関連付けるインデックスを定義するだけで、あとはデータベース側が自動的に管理してくれます。その後、セカンダリインデックスを通じてクエリエンジンでデータを検索できるようになります。

映画データ用のRediSearchインデックスを作成する

インデックスを作成するには、まずスキーマを定義し、インデックス対象となるフィールドとその型を列挙します。これらのフィールドはクエリでも使用できます。

この例では、4つのフィールドをインデックス化します。

  1. タイトル(title)
  2. 公開年(release_year)
  3. 評価(rating)
  4. ジャンル(genre)

インデックスの作成にはFT.CREATEコマンドを使用します。

> FT.CREATE idx:movie ON hash PREFIX 1 "movie:" SCHEMA title TEXT SORTABLE release_year NUMERIC SORTABLE rating NUMERIC SORTABLE genre TAG SORTABLE

OK

クエリを実行する前に、FT.CREATEコマンドの各要素を詳しく見てみましょう。

  • idx:movie:インデックス名。クエリ実行時に指定します。
  • ON hash:インデックス対象の構造の型。(現時点でRediSearch 2.0がサポートしているのはハッシュ構造のみですが、今後他の構造にも対応できるようパラメータとして用意されています。)
  • PREFIX 1 “movie:”:インデックス対象とするキーのプレフィックス。これはリスト形式のため、movie:*キーだけをインデックスしたい場合は数値を1にします。同じフィールドを持つ映画とテレビ番組の両方をインデックスしたい場合は、「PREFIX 2 “movie:” “tv_show:”」のように指定できます。
  • SCHEMA …:スキーマ、つまりインデックス対象のフィールドとその型を定義します。コマンド例ではTEXT、NUMERIC、TAGという型とSORTABLEパラメータを使用しています。

RediSearch 2.0のエンジンはPREFIXの値に基づいてデータベースをスキャンし、スキーマ定義に従ってインデックスを更新します。これにより、ハッシュを使用している既存アプリケーションへのインデックス追加が非常に簡単になり、コードを変更する必要はありません。

インデックスの情報は、以下のコマンドで確認できます。

> FT.INFO idx:movie

 1) index_name
 2) idx:movie
... 
46) 1) global_idle
    2) (integer) 0
...

これでインデックスを使ってデータベースを検索する準備が整いました。

映画データベースを検索する

このセクションではFT.SEARCHコマンドとその構文を使用します。本記事は入門編なので、基本に絞って解説し、細部までは踏み込みません。詳細を学びたい方は、ドキュメントやチュートリアルをご参照ください。

全文検索クエリ

RediSearchは全文検索エンジンであり、Googleのような強力なクエリをアプリケーションから実行できます。たとえば、「war」に関連する情報を含むすべての映画を検索するには、次のコマンドを実行します。

> FT.SEARCH idx:movie "war" RETURN 3 title release_year rating

1) (integer) 1
2) "movie:11002"
3) 1) "title"
   2) "Star Wars: Episode V - The Empire Strikes Back"
   3) "release_year"
   4) "1980"
   5) "rating"
   6) "8.7"

ご覧のとおり、検索語は「war」という単語1つだけですが、タイトルに「Wars」を含む『Star Wars: Episode V—The Empire Strikes Back』が見つかりました。これは、titleフィールドがテキストとしてインデックス化されており、トークン化とステミング(語形の正規化)が行われているためです。

また、コマンドでフィールドを指定していないため、「war」(および関連する単語)はインデックス内のすべてのテキストフィールドに対して検索されます。特定のフィールドを検索対象に絞りたい場合は、@field表記を使用します。

> FT.SEARCH idx:movie "@title:war" RETURN 3 title release_year rating

このシンプルなデータセットに対しては、以下のような全文検索クエリも実行できます。(注:記事を簡潔に保つため、クエリ結果は省略しています。)

前方一致検索:

> FT.SEARCH idx:movie "emp*" RETURN 3 title release_year rating

ファジー検索:

> FT.SEARCH idx:movie "%gdfather%" RETURN 3 title release_year rating

和集合:

> FT.SEARCH idx:movie "war | %gdfather%" RETURN 3 title release_year rating

クエリ構文の詳細については、RediSearchのドキュメントを参照してください。

タグフィールド検索

タグフィールド「genre」を使用して、すべての「drama(ドラマ)」作品を検索してみましょう。

> FT.SEARCH idx:movie "@genre:{Drama}" RETURN 3 title release_year rating

1) (integer) 1
2) "movie:11003"
3) 1) "title"
   2) "The Godfather"
   3) "release_year"
   4) "1972"
   5) "rating"
   6) "9.2"

@field:{value}という構文は、タグフィールドを検索していることを示します。タグフィルターの詳細については、RediSearchのドキュメントを参照してください。

データベースを更新して再検索する

ここまで検索してきたデータは、インデックス作成以前から存在していたもので、インデックス作成時にまとめて登録されたものです。ここで、新しい映画を追加して挙動を確認してみましょう。

> HSET "movie:11005" title "Star Wars: Episode VI - Return of the Jedi" plot "The Rebels destroy the Empire's Death Star." release_year 1983 genre "Action" rating 8.3 votes 906260 

(integer) 6

先ほどのクエリをもう一度実行してみます。

> FT.SEARCH idx:movie "war" RETURN 3 title release_year rating

1) (integer) 2
2) "movie:11005"
3) 1) "title"
   2) "Star Wars: Episode VI - Return of the Jedi"
   3) "release_year"
   4) "1983"
   5) "rating"
   6) "8.3"
4) "movie:11002"
5) 1) "title"
   2) "Star Wars: Episode V - The Empire Strikes Back"
   3) "release_year"
   4) "1980"
   5) "rating"
   6) "8.7"

ご覧のとおり、新しい映画が自動的にインデックスへ登録されています。

同様に、映画を削除したり有効期限切れにしたりした場合も、インデックスは自動的に更新されます。

> EXPIRE "movie:11002" 15

(integer) 1

15秒待ってから検索クエリを実行すると、その映画がインデックスから削除されていることがわかります。

一時的(エフェメラル)な検索を行いたい場合に、データとインデックスの有効期限管理をデータベースに任せられるのは非常に強力です。エフェメラル検索について詳しくは、ブログ記事「The Case for Ephemeral Search」をご覧ください。

次のステップ

本記事では、RediSearchの基本的な使い方を紹介し、アプリケーションのコードから見てインデックス処理がどれほど透過的かをお伝えしました。この機能はRediSearch 2.0で新たに導入されたものです。RediSearch 1.xでは、データをインデックス化するために明示的にFT.ADDコマンドを使用する必要がありました。

本記事で取り上げた検索・インデックス機能に加えて、RediSearchには強力なデータ集計(アグリゲーション)機能も備わっています。詳細については、RediSearchのドキュメント、チュートリアル、オンラインコースをご参照ください。

チュートリアルでは、本記事と同じデータをより大きなデータセットで扱い、さらに多くのサンプルクエリと集計を試せます。Java、Python、Node.jsなどのプログラミング言語からRediSearchを使用する方法を示すサンプルアプリケーションも収録されています。詳しくは、以下のリソースもチェックしてみてください。

  • RediSearch公式ページ
  • RediSearch 2.0チュートリアル
  • Rediscover Use Cases and Projects

  1. Android MessagesをPCで使おう!Web版の初期設定と知って得する便利機能5選

    Googleは巨大なプラットフォームであり、世界有数の検索エンジンであることは言うまでもありません。しかし、その実力は検索だけにとどまりません。日常生活をより快適にしてくれる多彩なサービスを数多く提供しています。そんなGoogleが、Android Messagesアプリのアップデートをリリースしました。これにより、任意のWebブラウザからSMSメッセージを送受信できるようになり、AndroidユーザーはPCやMacから手軽にメッセージのやり取りが可能になりました。 利用に必要なのは、最新版にアップデートしたAndroid Messagesアプリだけ。以下では、Web版Android Mess

  2. Xen 仮想化の開始

    Zで綴られるZenは、8時間保持した後、雪の中でおしっこをしているときに頭頂部にある典型的な感覚です. Xen は X で綴られており、KVM と同様に、企業市場を対象としていますが、家庭でもビジネスでもセットアップを検討できるオープンソースの仮想化テクノロジです。 KVM に関するいくつかのチュートリアルがあり、導入記事、ストレージとネットワーク (ブリッジ ネットワークを含む) のセットアップと構成の方法、および VirtualBox との競合の解決方法をカバーしています。ここで、Xen についてもう少し学びましょう。同様に、仮想マシンをインストールして実行するために必要な最初の手順、