すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):TairSearchを使用して複数列のインデックスでクエリを高速化

最終更新日:Dec 05, 2024

TairSearchは、キャッシュ機能とコンピューティング機能の両方を提供するリアルタイムのメモリ内検索モジュールです。 モジュールのコア機能として、転置インデックスはホットデータの保存と単語ルートによるファジーマッチクエリの両方をサポートします。 これにより、データストレージとコンピューティングを統合し、複数列のインデックスを使用してクエリを高速化できます。

背景情報

通常、インターネットおよび従来の業界におけるアプリケーションサービスの重要なデータは、MySQLなどのリレーショナルデータベースに格納されます。 データベースアクセスの負荷を減らし、クエリ効率を向上させるために、Redisのようなキー値キャッシュシステムを使用してホットデータをクエリします。 ただし、通常のキー値キャッシングシステムは、複数列のインデックスを持つクエリまたはLIKEベースのファジーマッチクエリに対して独立して機能することはできません。 この場合、複数列のインデックスを使用してクエリを実装するには、Luaスクリプトやオンディスクコンピューティングなどの追加のフィルタリングメカニズムが必要です。

複数列インデックスを持つクエリに対するキー値キャッシュシステムの制限

通常、リレーショナルデータベースからRedisなどのキー値キャッシュシステムにデータをインポートする場合、行はハッシュに格納されます。 これらの行の主キーがハッシュキーとして使用されます。 これらの行の他のフィールドおよびそれらの値は、ハッシュフィールドおよびそれらの値として使用される。

クエリにプライマリキーインデックスのみが含まれる場合、RedisでHMGETコマンドを実行して、特定のフィールドの情報をクエリできます。 リレーショナルデータベースを使用すると、プライマリキーインデックス、複数のセカンダリインデックス、および複数列インデックスを作成して、クエリ効率を向上させることができます。 それに比べて、Redisには次のシナリオで制限があります。

  • セカンダリインデックスを使用したクエリ: Redisはハッシュフィールドによるクエリを許可しません。 したがって、リレーショナルデータベースのセカンダリインデックスを格納するには、2層のハッシュ構造を作成する必要があります。 ただし、この2層のハッシュ構造では、Redisへのデータのインポートが複雑になり、データの冗長性によりメモリが無駄になります。

  • 複数列のインデックスを使用したクエリ: Redisでは、ハッシュに対する複数列のクエリは許可されません。 複数列クエリは、Luaスクリプトまたはオンディスクコンピューティングによってのみ実装できます。

このトピックでは、TairSearchを使用して複数列のインデックスでクエリを高速化する方法について説明します。 この例では、TairSearchを使用して、交通量の急増時の航空券検索をサポートします。

説明

TairSearchの詳細については、「Search」をご参照ください。

正確な航空券検索の例

祝日には、人気のある観光地へのフライトを大量に検索した結果、交通量が急増する可能性があります。 この場合、TairSearchを使用してフライト情報を保存できます。

ドキュメントインデックスの作成

この例では、正確な航空券検索には、出発地、目的地、出発日、座席クラス、および幼児と一緒に旅行するか子供と一緒に旅行するかなどのキーワードが含まれます。

この例では、TairSearchのインデックスのキー (出発地_目的地) として、出発地と目的地の組み合わせが使用されます。 キー値の例: zhuhai_hangzhou。 以下のインデックスフィールドが作成される: 出発目的地日付座席withflight_id価格出発地_時間、および目的地_時間

説明

フィールドを追加または変更する場合は、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

TairSearchドキュメントへのデータの書き込み

フライト情報を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"}"
# The document ID is returned in the JSON format.

フライト情報を正確に検索

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
        }
    }
}"