TairSearch は、キャッシングとコンピュテーションを統合した、リアルタイムのフルメモリ検索システムです。そのコアとなる転置インデックスメカニズムは、語根のあいまい一致クエリをサポートするだけでなく、TairSearch をホットデータストアとして機能させることも可能です。この計算とストレージの統合により、任意の数の列にわたる複数列クエリが高速化されます。
背景情報
多くのアプリケーションでは、MySQL などのリレーショナルデータベースにキーデータを格納します。データベースの負荷を軽減し、パフォーマンスを向上させるために、開発者は Redis のような KV キャッシュシステムを追加して、ホットデータのクエリを処理することがよくあります。しかし、ユースケースで複数列クエリやデータベースでの LIKE あいまい一致クエリが必要な場合、標準的な KV キャッシュシステムだけではこれらのシナリオに対応できません。複数列クエリを実行するには、Lua スクリプトや外部計算などの追加のフィルタリングおよびマッチングメカニズムが必要になります。
KV キャッシュシステムの複数列クエリシナリオにおける制限
リレーショナルデータベースから Redis のような KV キャッシュシステムにデータをインポートする場合、通常、各行を Redis ハッシュに格納します。行のプライマリキーが Redis のハッシュキーになり、他の列名と値がハッシュのフィールドと値になります。
Redis の HMGET コマンドを使用すると、プライマリキーによって指定されたフィールドを直接取得できます。しかし、リレーショナルデータベースにはプライマリキーだけでなく、クエリ効率を向上させるための複数のセカンダリインデックスやさまざまな複数列インデックスが存在する場合があります。Redis には、次のシナリオで大きな制限があります:
-
セカンダリインデックスクエリ:Redis は、フィールド値によるハッシュのクエリをサポートしていません。そのため、セカンダリインデックスの値をプライマリキーにマッピングし直すための別のインデックスを Redis に構築する必要があります。このソリューションは、データインポートの複雑さを増し、データ冗長性のためにメモリを浪費します。
-
複数列クエリ:Redis は、複数のフィールド値に基づくハッシュのクエリをサポートしていません。このようなクエリは、例えば Lua スクリプトや外部アプリケーションロジックを使用して、独自に実装する必要があります。
このトピックでは、トラフィックが急増した際の航空券検索サービスを例に、TairSearch が複数列クエリをどのように高速化するかを説明します。
TairSearch とコマンドの例の詳細については、「検索」をご参照ください。
精密なフライト検索
人気の観光地へのフライト検索は、夏休み、国慶節、春節などの長期休暇中にトラフィックの急増を引き起こす可能性があります。これらの急増に対応するために、今後のすべてのフライト情報を TairSearch に格納できます。
ステップ 1:ドキュメントインデックスの作成
一般的な航空券予約プラットフォームでは、精密なフライト検索には、出発地、目的地、旅行日、座席クラス、乗客が子供や乳幼児を同伴しているかどうかなど、いくつかの重要な基準が含まれます。
この例では、TairSearch のインデックス名 (departure_destination) は、出発地と目的地の場所を連結したもので、例えば zhuhai_hangzhou のようになります。次のインデックスフィールドが作成されます:出発地 (departure)、目的地 (destination)、日付 (date)、座席 (seat)、子供または乳幼児の同伴の有無 (with)、フライト ID (flight_id)、価格 (price)、出発時刻 (departure_time)、到着時刻 (destination_time)。
フィールドを追加または変更するには、TFT.UPDATEINDEX コマンドを実行します。
サンプルコマンド:
TFT.CREATEINDEX zhuhai_hangzhou '{
"mappings":{
"properties":{
"departure":{"type":"keyword"},
"destination":{"type":"keyword"},
"date":{"type":"keyword"},
"seat":{"type":"keyword"},
"with":{"type":"keyword"},
"flight_id":{"type":"keyword"},
"price":{"type":"double"},
"departure_time":{"type":"long"},
"destination_time":{"type":"long"}
}
}
}'
期待される出力:
OK
ステップ 2:データの書き込み
フライト情報をドキュメントとして TairSearch インデックスに書き込みます。以下はコマンドの例です。
TFT.ADDDOC zhuhai_hangzhou '{
"departure":"zhuhai",
"destination":"hangzhou",
"date":"2022-09-01",
"seat":"first",
"with":"baby",
"flight_id":"CZ1000",
"price":986.1,
"departure_time":1661991010,
"destination_time":1661998210
}'
期待される出力:
"{"_id":"16615908912020060"}"
# 新しいドキュメントの ID を返します。
ステップ 3:精密検索
2022年9月1日に珠海から杭州へ向かうファーストクラスのフライトを、出発時刻でソートして検索するには、次のコマンドを実行します。
TFT.Search zhuhai_hangzhou '{"sort":["departure_time"],"query":{"bool":{"must":[{"term":{"date":"2022-09-01"}},{"term":{"seat":"first"}}]}}}'
期待される出力:
"{
"hits": {
"hits": [
{
"_id": "16615908912020060",
"_index": "zhuhai_hangzhou",
"_score": 0.433955,
"_source": {
"departure": "zhuhai",
"destination": "hangzhou",
"date": "2022-09-01",
"seat": "first",
"with": "baby",
"flight_id": "CZ1000",
"price": 986.1,
"departure_time": 1661991010,
"destination_time": 1661998210
}
}
],
"max_score": 0.433955,
"total": {
"relation": "eq",
"value": 1
}
}
}"