RediSearchを実践しよう:Azure Cache for RedisとGoで作るリアルタイムツイート検索アプリ
Redisは、シンプルなStringから強力な抽象化であるRedis Streamsまで、多彩なデータ構造を備えています。ネイティブなデータ型だけでも多くの用途に対応できますが、特定のユースケースでは追加の工夫が必要になることがあります。その代表例がセカンダリインデックス(二次インデックス)の活用です。キーによる検索・参照にとどまらず、より高度なクエリ機能を実現したい場合には、セカンダリインデックスが求められます。Sorted SetやListなどを駆使して実現することも可能ですが、いくつかのトレードオフを考慮する必要があります。
そこで登場するのがRediSearchです。Redisモジュールとして提供されるRediSearchは、第一級のセカンダリインデックスエンジンにより柔軟な検索機能を実現します。全文検索、自動補完、地理空間インデックスなど、強力な機能を多数備えています。
この記事では、RediSearch Goクライアントを使用して構築したGoサービスを通じて、Azure Cache for RedisでRediSearchを活用する実践的な例を紹介します。リアルタイムにツイートを取り込み、RediSearchを使って柔軟にクエリできる一連のアプリケーションを題材にします。
具体的には、以下の内容を学ぶことができます。
- RediSearchインデックスの扱い方
- TEXT、NUMERIC、TAGなど、さまざまなRediSearchデータ型の使い方
- RediSearchの機能を示すアプリケーションの構築方法
- わずかなコマンドだけでサービスコンポーネントをAzureへデプロイする方法
- RediSearchへのクエリによるツイートデータの分析手法
アプリケーション概要
前述のとおり、サンプルサービスはツイートをリアルタイムに取得し、RediSearch経由でクエリできるようにします。

このサービスは、次の2つのコンポーネントで構成されています。
- Consumer/Indexer(コンシューマー/インデクサー): Twitter Streaming APIから読み取り、インデックスを作成し、到着したツイートデータ(Redis HASH形式)を継続的に追加します。
- Search service(検索サービス): RediSearchクエリ構文を使用してツイートを検索できるREST APIです。
ここからは、ソリューションを起動して実際に動かす方法を解説します。個々のコンポーネントの内部動作に関心がある方は、後述の「コード解説」セクションと、この記事のGitHubリポジトリ(https://github.com/abhirockzz/redisearch-tweet-analysis)を参照してください。
前提条件
- まず、Microsoft Azureアカウントが必要です。こちらから無料で取得できます。
- 上記のサービスコンポーネントは、Docker CLIのネイティブコマンドを使用してAzure Container Instancesにデプロイされます。この機能は、DockerとAzureの統合によって実現されています。
- WindowsまたはmacOSの場合はDocker Desktopバージョン2.3.0.5以降、Linuxの場合はDocker ACI Integration CLIのインストールが必要です。また、Twitter Streaming APIを使用するにはTwitter開発者アカウントも必要です。お持ちでない場合は、公式の手順に従って取得してください。
RediSearchを動かしてみよう
まず、クイックスタートチュートリアルに従って、Azure上にRedis Enterpriseティアのキャッシュをセットアップします。セットアップが完了したら、Redisホスト名とアクセスキーを手元に控えておいてください。

サービスの両コンポーネント(ツイートインデックスサービスとSearch APIサービス)は、Dockerコンテナとして提供されています。独自のDockerイメージをビルドしたい場合は、GitHubリポジトリにある各Dockerfileをご利用ください。
それでは、これらをAzure Container Instancesにデプロイする手順を見ていきましょう。Azure Container Instancesを使えば、マネージドでサーバーレスなAzure環境において、オンデマンドでDockerコンテナを実行できます。
Azureへのデプロイ
docker-compose.ymlファイルが、各コンポーネント(tweets-searchとtweets-indexer)を定義しています。必要な作業は、Azure Redisインスタンスの接続情報とTwitter開発者アカウントの認証情報を、ご自身の値に書き換えるだけです。
まず、Azureコンテキストを作成します。
次に、GitHubリポジトリをクローンします。
そして、両方のサービスコンポーネントをコンテナグループとしてデプロイします。
注意: ACIコンテキストで現在利用可能なDocker Composeコマンドはdocker compose(スペース区切り)で始まります。ハイフン付きのdocker-composeとは異なるのでご注意ください。
デプロイが成功すると、次のような出力が表示されます。
サービスの起動を待ちます。Azureポータルでも状況を確認できます。両方のサービスが稼働したら、それぞれのログを確認しましょう。
すべて順調であれば、ツイートコンシューマーサービスが起動し、ツイートのストリームを読み取ってRedisに永続化していきます。
いよいよクエリを実行!
ここからは、ツイートデータをクエリしてみましょう。Azure Container Instances上のREST APIには、IPアドレスと完全修飾ドメイン名(FQDN)を使用してアクセスできます(詳細はContainer Accessのドキュメントを参照)。IPアドレスを確認するには、docker psを実行し、出力のPORTSセクションをチェックします。
準備が整ったら、あらゆる種類のクエリを実行できます。その前に、検索クエリで使用できるインデックス済みの属性を簡単に確認しておきましょう。
ヒント: 以下の例ではcurlを使用していますが、VS Codeの「REST Client」拡張機能を使うとさらに快適に操作できます。
まず、検索サービスAPIのベースURLを設定します。
最初はシンプルに、すべてのドキュメントをクエリしてみます(*を使用)。
すると、次のような出力が得られます。
レスポンスヘッダーのPage-SizeとSearch-Hitsに注目してください。これらはアプリケーションが渡すカスタムヘッダーで、主にページネーションと件数制限を示すために設けられています。「すべてのドキュメントを取得」というクエリに対して、Redis内では12件の結果が見つかったものの、返却されたJSONボディには10件しか含まれていません。これはRediSearch Go APIのデフォルト動作によるもので、クエリパラメータを変更すれば調整可能です。
たとえば、iPhoneから送信されたツイートだけを検索することもできます。
クエリ結果にすべての属性が必要ないケースもあります。たとえば、ユーザー名(Twitterスクリーンネーム)とツイート本文だけを取得するには、次のようにします。
ユーザー名での絞り込みはどうでしょうか(例:「jo」で始まるユーザー)。
複数の属性を組み合わせたクエリも当然可能です。
特定のハッシュタグを含むツイートを探したい場合はどうでしょう。複数のハッシュタグを|(パイプ)で区切って指定することもできます。
「biden」ハッシュタグが付いたツイートが最近どれだけ投稿されたかを知りたいときは、範囲クエリが便利です。
さらに、ツイートから位置情報(座標)を取得できた場合は、抽出したデータをもとにcoordinates属性でクエリすることもできます。
これらはほんの一例にすぎません。ぜひ自由に試して、他のクエリも体験してみてください。RediSearch公式ドキュメントの該当セクションが参考になるはずです。
重要: 検証が終わったら、忘れずにサービスとAzure Container Instances上のコンテナを停止してください。その後、Azure Portalから作成したAzure Redisインスタンスを削除しましょう。
コード解説
このセクションでは、各コンポーネントのコードの概要を説明します。GitHubリポジトリのソースコードを読み進める際の参考にしてください。
ツイートコンシューマー/インデクサー
Twitterとの連携にはgo-twitterライブラリを使用しています。
まず、Twitter Streaming APIに対して認証を行います。
そして、別のゴルーチンでツイートのストリームをリッスンします。
index.AddData(tweetToMap(tweet))の箇所に注目してください。ここでインデックスコンポーネントが呼び出され、Azure Cache for Redisに接続します。
その後、インデックスを再作成する前に、既存のインデックス(および関連ドキュメント)を削除します。
インデックスとドキュメントを削除するのは、常にクリーンな状態から開始できるようにするためです。これにより、実験やデモが容易になります。不要であれば、この部分をコメントアウトしても問題ありません。
各ツイートの情報は、HSET操作を使ってHASH型(tweet:<ツイートID>というキー名)として保存されます。
ツイート検索サービス
Tweets searchは、RediSearchをクエリするためのREST APIを公開しています。すべてのオプション(検索クエリなど)はクエリパラメータとして渡されます。たとえば、https://localhost:8080/search?q=@source:iphoneのような形式です。ハンドラは必要なクエリパラメータを抽出します。
qパラメータは必須です。加えて、以下のパラメータも利用できます。
fields: 結果に含める属性を指定します。offset_limit: 検索の開始位置(オフセット)と結果に含めるドキュメント数を指定します(デフォルトでは、RediSearch Goクライアントの仕様に従い、オフセットは0、上限は10件です)。
最後に、結果を反復処理し、JSON形式(ドキュメントの配列)としてクライアントに返却します。
以上でコード解説は終わりです。
Azure Cache for RedisのRedis Enterpriseティア
Redis Enterpriseは、MicrosoftとRedisが運営・サポートするAzure Cache for Redisの2つの新しいティアとして、Azure上でネイティブサービスとして利用できます。このサービスにより、開発者はRediSearchなどのモジュールを含む、豊富なRedis Enterprise機能にアクセスできます。詳細については、以下のリソースを参照してください。
- Azure Cache for Redis Enterpriseティアの一般提供開始について
- Microsoftとのパートナーシップ強化によるクラウドでのRedis Enterprise拡大
- MicrosoftとRedisの協業による新しいAzure Cache for Redis機能
- Azure Cache for Redisで利用できるRedis Enterprise機能
まとめ
このエンドツーエンドのアプリケーションを通じて、インデックスの操作方法、リアルタイムデータの取り込みとRediSearchエンジンによるドキュメント(ツイート情報)のインデックス化、そして柔軟なクエリ構文を使ったツイートデータからのインサイト抽出方法を学びました。
Redisドキュメントサイトでトピックを検索したとき、裏側で何が起こっているのか気になったことはありませんか?Redis公式サイトがRediSearchで全文検索を実装した方法について解説したブログ記事もあります。また、サーバーレスアプリケーションでRediSearchを活用する方法にも興味があるかもしれませんね。
これから始める方は、まずRediSearchクイックスタートページをチェックしてみてください。
Azure Cache for Redisのエンタープライズ機能についてさらに詳しく知りたい場合は、以下のリソースが役立ちます。
- マルチゾーン冗長性の概要と設定方法
- ネットワーク分離を実現するPrivate Linkサポート
- 適切なキャッシュティアの選び方
- Enterpriseティアにおける高可用性
-
RediSearch 2.0、最初のマイルストーンに到達 ― データ自動インデックス化の新アーキテクチャ
RediSearch 2.0の開発における最初のマイルストーンとなるリリースをお知らせできることを大変うれしく思います。RediSearchはリアルタイム検索エンジンで、Redis上のデータに対してクエリを実行し、幅広い種類の複雑な問い合わせに答えることができます。このマイルストーンは「2.0-M01」と呼ばれ、インデックスとデータの同期方法が再設計されたことを示しています。従来のようにFT.ADDコマンドを使ってインデックス経由でデータを書き込む必要はなくなり、RediSearchがハッシュに書き込まれたデータを追跡して、自動的にインデックス化するようになりました。この大きなメリットは、アプ
-
【Windows 10】アクション センターを有効・無効にする3つの方法
Windows 10 のアクション センターは、アプリの通知を確認したり、各種設定にすばやくアクセスしたりできる便利な機能です。しかし、すべてのユーザーがこの機能を気に入っているとは限らず、実際にはほとんど使わないという人も少なくありません。そのため、アクション センターを無効にしたいと考えるユーザーも多く存在します。 一方で、アクション センターにはクイック アクションボタンを自由にカスタマイズできるほか、通知を削除するまで過去の通知をすべて表示してくれるといったメリットもあります。しかし、未読通知を毎回手動で削除するのが面倒だと感じる人にとっては、アクション センターはむしろ不要な存在に