TairSearch は、Tair (Redis OSS 互換) に組み込まれた全文検索モジュールです。Elasticsearch に似たクエリ構文を使用し、ミリ秒レベルの書き込みおよび検索パフォーマンスを提供します。
概要
TairSearch は以下の機能を提供します:
-
低レイテンシと高性能:Tair のインメモリエンジンによるミリ秒レベルの書き込みと全文検索。詳細については、「TairSearch パフォーマンスホワイトペーパー」をご参照ください。
-
増分および部分更新:ドキュメント全体を書き換えることなく、個々のドキュメントフィールドの追加、更新、削除、自動インクリメントが可能です。
-
Elasticsearch のようなクエリ構文:
bool、match、term、ページング、ソートをサポートする JSON ベースのクエリ DSL で、Elasticsearch の使用経験がある開発者には馴染み深いものです。 -
集約: 検索結果の分析に用いる
terms、メトリック、およびfilter集約。 詳細については、「集約」をご参照ください。 -
オートコンプリート:入力中の検索体験を実現する、プレフィックスベースのあいまい一致。
-
組み込みアナライザとカスタムアナライザ: 英語 (
standard,stop)、中国語 (jieba,IK) などの言語に対応した組み込みアナライザに加え、ユーザー定義の辞書とストップワードを使用したカスタムアナライザもサポートされています。 詳細については、「検索アナライザ」をご参照ください。 -
シャードインデックスクエリ:
TFT.MSEARCHを使用して複数のシャードインデックスを横断して検索し、集計結果を取得します。 -
ドキュメントの圧縮:保存されたドキュメントを圧縮してメモリ使用量を削減します。デフォルトでは無効です。
-
クエリキャッシュ:最近のクエリ結果をキャッシュして、ホットデータのクエリパフォーマンスを向上させます。
前提条件
インスタンスは、以下のいずれかのバージョンを実行している Tair メモリ最適化インスタンス (DRAM ベース) である必要があります:
|
エンジンバージョン |
最小マイナーバージョン |
|
Redis 5.0 互換 |
1.7.27 以降 |
|
Redis 6.0 互換 |
6.2.4.1 以降 |
|
Redis 7.0 互換 |
すべてのマイナーバージョン |
最新の機能と最高の安定性を得るために、インスタンスを最新のマイナーバージョンに更新してください。手順については、「マイナーバージョンとプロキシバージョンのアップグレード」をご参照ください。クラスターインスタンスまたは読み書き分離インスタンスの場合、すべてのコマンドが期待どおりに動作することを確認するために、プロキシノードも最新のマイナーバージョンに更新してください。
リリースノート
Redis 5.0 互換 DRAM ベースインスタンス
|
日付 |
バージョン |
変更点 |
|
2022-03-11 |
V1.7.27 |
TairSearch リリース |
|
2022-05-24 |
V1.8.5 |
集約機能 |
|
2022-09-06 |
V5.0.15 |
|
|
2023-01-13 |
V5.0.25 |
アナライザ |
|
2023-03-15 |
V5.0.28 |
クエリキャッシュ、ドキュメント圧縮、 |
|
2023-06-12 |
V5.0.35 |
ARRAY データ型、Okapi BM25 類似性アルゴリズム |
Redis 6.0 互換 DRAM ベースインスタンス
|
日付 |
バージョン |
変更点 |
|
2023-02-07 |
V6.2.4.1 |
TairSearch (V5.0.25 のすべての機能) |
|
2023-03-14 |
V6.2.5.0 |
クエリキャッシュ、ドキュメントの圧縮、 |
|
2023-06-12 |
V6.2.7.3 |
ARRAY データ型、Okapi BM25 (V5.0.35 のすべての機能) |
|
2023-12-21 |
V23.12.1.2 |
|
Redis 7.0 互換 DRAM ベースインスタンス
|
日付 |
バージョン |
変更点 |
|
2024-07-22 |
V24.7.0.0 |
TairSearch のサポート |
ベストプラクティス
注意事項
-
TairSearch データは Tair インスタンスに保存され、インスタンスのメモリを消費します。
-
メモリ使用量を削減するには:
-
検索が必要なフィールドにのみ、
indexをtrueに設定します。それ以外のフィールドには、indexをfalseに設定します。 -
_sourceでincludes/excludesパターンを使用して、必要なドキュメントフィールドのみを保存します。 -
不要なトークナイゼーションとメモリ使用量の増加を避けるために、適切なアナライザを選択します。
-
大きなドキュメントにはドキュメント圧縮を有効にします。
-
-
インデックスあたりのドキュメント数は 500万以内にします。これにより、クラスターインスタンスのデータスキューが防止され、読み取りおよび書き込みリクエストのバランスが保たれ、large キーとホットキーが削減されます。large データセットは複数のインデックスに分割し、
TFT.MSEARCHを使用してまとめてクエリします。
構文の規則
|
規則 |
意味 |
|
|
|
コマンドキーワード |
|
|
*italic* |
変数 |
|
|
|
オプションのパラメーター。角括弧のないパラメーターは必須です。 |
|
|
`A\ |
B` |
相互に排他的なパラメーター。1 つだけ指定してください。 |
|
|
先行するパラメーターは繰り返し可能です。 |
全文検索コマンド
TFT.CREATEINDEX
マッピング定義を持つインデックスを作成します。マッピング構文は、Elasticsearch の明示的なマッピングに似ています。ドキュメントを追加する前に、インデックスを作成する必要があります。
構文
TFT.CREATEINDEX index mappings [settings]
大きなキーを防ぐには、大きなインデックスを同一のmappingsとsettingsを持つより小さなインデックスに分割してから、TFT.MSEARCHでまとめてクエリします。
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
作成するインデックスの名前。 |
|
*mappings* |
はい |
JSON 形式のマッピング定義。「マッピングオプション」をご参照ください。 |
|
*settings* |
いいえ |
インデックスの JSON 設定。「インデックス設定」をご参照ください。 |
マッピングオプション
mappings オブジェクトは、以下のトップレベルフィールドをサポートしています:
dynamic
マッピングモード。有効な値:
-
"strict":データはpropertiesで定義されたフィールドにのみ書き込まれます。未定義のフィールドへの書き込みは失敗します。 -
指定なし (デフォルト) -- 非厳密モード。システムは、書き込まれたフィールドが
propertiesで定義されているかどうかをチェックしません。
enabled
非インデックスフィールド (index が false に設定されている) の型チェックを制御します。有効な値は true (デフォルト) と false です。true の場合、フィールドの型が properties で定義された型と一致しないと、書き込みは失敗します。インデックスフィールドは、この設定に関係なく常に型チェックされます。
_source
元のドキュメントを保存するかどうかを制御します。この設定はインデックス作成には影響しません。
-
enabled--true(デフォルト) は元のドキュメントを保存し、falseは保存しません。 -
includes-- 含めるフィールド名のパターンの配列。ワイルドカードがサポートされています。 -
excludes-- 除外するフィールド名パターンの配列。ワイルドカードがサポートされています。フィールドがincludesとexcludesの両方に一致する場合、excludesが優先されます (フィールドは保存されません)。
例:
"_source": {"enabled": true}
これは、すべてのフィールドを保存するデフォルト設定です。 "_source": {"enabled": true, "excludes": [], "includes": []} と同等です。
"_source": {"enabled": true, "excludes": [], "includes": ["id", "name"]}
id と name フィールドのみが保存されます。
properties
フィールド定義のコレクション。各フィールドは以下の属性をサポートします:
|
属性 |
説明 |
デフォルト |
|
|
データ型。「フィールドの型」をご参照ください。 |
必須 |
|
|
このフィールドをインデックスに含める (検索対象とする) かどうか。 |
|
|
|
スコアリングのためのフィールドの重み。正の浮動小数点数。 |
|
|
|
類似性アルゴリズム: |
|
フィールドの型
|
型 |
説明 |
型固有のオプション |
|
|
トークン化されない文字列。完全一致クエリに適しています。 |
|
|
|
インデックス付けの前にアナライザによってトークン化される文字列。 |
|
|
|
64 ビット整数。タイムスタンプ (UNIX エポック) に適しています。 |
-- |
|
|
32 ビット整数。 |
-- |
|
|
64 ビットの浮動小数点数。 |
-- |
配列のサポート:すべてのフィールドタイプは配列に対応しています。型名に [] を付加します。たとえば、keyword[] はキーワードの配列を宣言します。
TFT.CREATEINDEX idx:products '{"mappings":{"properties":{"tags":{"type":"keyword[]"}}}}'
テキストアナライザオプション
|
オプション |
説明 |
デフォルト |
|
|
インデックス作成に使用されるアナライザです。「組み込みアナライザ」をご参照ください。カスタムアナライザも指定でき、 |
|
|
|
検索時に使用されるアナライザです。有効な値は |
|
組み込みアナライザ
standard (デフォルト)、 jieba (中国語に推奨、chinese よりも効果的)、 stop、 IK、 pattern、 whitespace、 simple、 keyword、 chinese、 french、 dutch、 russian。
詳細については、「組み込みアナライザ」をご参照ください。
インデックス設定
オプションの settings オブジェクトは、以下のフィールドをサポートしています。
analysis
カスタムアナライザを定義します。詳細については、「カスタムアナライザ」をご参照ください。
index
カスタム類似性アルゴリズムを構成します。これを使用して Okapi BM25 パラメーターをカスタマイズします:
|
パラメーター |
説明 |
デフォルト |
有効な値 |
|
|
term の頻度がスコアにどれだけ影響するかを制御します。値が大きいほど効果が大きくなります。 |
|
|
|
|
ドキュメントの長さがスコアにどれだけ影響するかを制御します。値が大きいほど効果が大きくなります。 |
|
|
例:
TFT.CREATEINDEX idx:products '{"mappings":{"properties":{"name":{"type":"keyword","similarity":"my_bm25"}}},"settings":{"index":{"similarity":{"my_bm25":{"type":"BM25","k1":1.0,"b":1.0}}}}}'
queries_cache
クエリ結果キャッシュを構成します。デフォルトでは、キャッシュはメモリ制限なしで最大 10,000 件の結果を保存します。いっぱいになると、LRU (Least Recently Used) アルゴリズムを使用して結果が削除されます。
|
パラメーター |
型 |
説明 |
デフォルト |
|
|
STRING |
クエリキャッシュ全体の最大メモリで、 |
制限なし |
|
|
INTEGER |
キャッシュされた結果の TTL (Time to Live)、単位は秒。 |
|
例:
"settings": {"queries_cache": {"size": "100mb", "ttl": 3}}
queries_cacheはノードレベルのパラメーターです。これを1つのインデックスで構成すると、同じプロセス内の他のすべてのインデックスに影響します。すべてのインデックスで同じqueries_cache構成を使用してください。
compress_doc
透過的なドキュメント圧縮を構成します。圧縮を有効にすると、CPU 消費量と読み書きレイテンシが増加します。インデックスが大規模 (数 KB 以上) で、ストレージコストが主な懸念事項である場合にのみ有効にしてください。
|
パラメーター |
型 |
説明 |
デフォルト |
|
|
STRING |
圧縮しきい値。ドキュメントは、このサイズに達した場合にのみ圧縮されます。単位として |
|
|
|
BOOLEAN |
圧縮を有効にするかどうか。 |
|
例:
"settings": {"compress_doc": {"size": "1kb", "enable": true}}
圧縮は、TFT.UPDATEINDEX で設定を有効にした後に作成または更新されたドキュメントにのみ適用されます。既存のドキュメントは遡って圧縮されません。
戻り値
-
成功時:
OK -
失敗時:エラーメッセージ
例
TFT.CREATEINDEX idx:product '{"mappings":{"_source":{"enabled":true},"properties":{"product_id":{"type":"keyword","ignore_above":128},"product_name":{"type":"text"},"product_title":{"type":"text","analyzer":"jieba"},"price":{"type":"double"}}}}'OK
関連ドキュメント:TFT.UPDATEINDEX、TFT.GETINDEX
TFT.UPDATEINDEX
インデックスマッピングに新しいフィールドを追加するか、インデックス設定を変更します。
構文
TFT.UPDATEINDEX index mappings [settings]
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*mappings* |
はい |
追加する新しい |
|
*settings* |
いいえ |
変更済みのインデックス設定。 |
mappings と settings の完全な構文については、「TFT.CREATEINDEX」をご参照ください。
戻り値
-
成功時:
OK -
失敗時:エラーメッセージ
例
TFT.UPDATEINDEX idx:product '{"mappings":{"properties":{"product_group":{"type":"text","analyzer":"chinese"}}}}'OK
関連ドキュメント:TFT.CREATEINDEX、TFT.GETINDEX
TFT.GETINDEX
インデックスのマッピングと設定を取得します。
構文
TFT.GETINDEX index
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
戻り値
-
成功時:インデックスの JSON 形式のマッピングコンテンツ
-
失敗時:エラーメッセージ
例
TFT.GETINDEX idx:product{"idx:product0310":{"mappings":{"_source":{"enabled":true,"excludes":[],"includes":["product_id"]},"dynamic":"false","properties":{"price":{"boost":1.0,"enabled":true,"ignore_above":-1,"index":true,"similarity":"classic","type":"double"},"product_id":{"boost":1.0,"enabled":true,"ignore_above":128,"index":true,"similarity":"classic","type":"keyword"},"product_name":{"boost":1.0,"enabled":true,"ignore_above":-1,"index":true,"similarity":"classic","type":"text"},"product_title":{"analyzer":"chinese","boost":1.0,"enabled":true,"ignore_above":-1,"index":true,"similarity":"classic","type":"text"}}}}}
関連ドキュメント:TFT.CREATEINDEX、TFT.UPDATEINDEX
TFT.ADDDOC
インデックスに単一のドキュメントを追加します。
構文
TFT.ADDDOC index document [WITH_ID doc_id]
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*document* |
はい |
JSON ドキュメント。フィールド値はマッピングで定義されたデータ型と一致する必要があります。 |
|
|
いいえ |
カスタムドキュメント ID (文字列)。省略した場合、ID は自動生成されます。指定した ID が既に存在する場合、既存のドキュメントは上書きされます。 |
_sourceがincludesで設定されている場合、ドキュメントの追加または更新時に、includesに記載されているフィールドのみが保存されます。
戻り値
-
成功時:ドキュメント ID を含む JSON オブジェクト、例:
{"_id":"00001"} -
失敗時:エラーメッセージ
例
カスタム ID でドキュメントを追加:
TFT.ADDDOC idx:product '{"product_id":"product test"}' WITH_ID 00001{"_id":"00001"}
配列フィールドを持つドキュメントを追加:
TFT.ADDDOC idx:product '{"product_id":["an","2","3df"]}' WITH_ID 00001
関連ドキュメント:TFT.MADDDOC、TFT.UPDATEDOCFIELD、TFT.DELDOC
TFT.MADDDOC
単一のアトミック操作でインデックスに複数のドキュメントを追加します。いずれかのドキュメントのフォーマットが無効な場合、どのドキュメントも追加されません。
構文
TFT.MADDDOC index document doc_id [document1 doc_id1] ...
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*document* |
はい |
JSON ドキュメント。フィールド値はマッピングで定義されたデータ型と一致する必要があります。 |
|
*doc_id* |
はい |
ドキュメント ID (文字列)。 |
_sourceがincludesで設定されている場合、ドキュメントを追加または更新する際に、includesにリストされているフィールドのみが保存されます。
戻り値
-
成功時:
OK -
失敗時:エラーメッセージ
例
TFT.MADDDOC idx:product '{"product_id":"test1"}' 00011 '{"product_id":"test2"}' 00012OK
関連ドキュメント:TFT.ADDDOC、TFT.DELDOC
TFT.UPDATEDOCFIELD
ドキュメントの特定のフィールドを更新します。ドキュメントが存在しない場合は作成されます (TFT.ADDDOC に相当)。フィールドが存在しない場合は追加されます。
構文
TFT.UPDATEDOCFIELD index doc_id document
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*doc_id* |
はい |
更新するドキュメントの ID。 |
|
*document* |
はい |
更新するフィールドを含む JSON オブジェクト。インデックス付けされたフィールドはマッピングで定義されたデータ型と一致する必要があります。インデックス付けされていないフィールドは任意の型にできます。 |
_sourceにincludesが設定されている場合、ドキュメントの追加または更新時に、includesで指定されたフィールドのみが保存されます。
戻り値
-
成功時:
OK -
失敗時:エラーメッセージ
例
TFT.UPDATEDOCFIELD idx:product 00011 '{"product_id":"test8","product_group":"BOOK"}'OK
関連ドキュメント:TFT.ADDDOC、TFT.DELDOCFIELD
TFT.DELDOCFIELD
ドキュメントから 1 つ以上のフィールドを削除します。フィールドがインデックス付けされている場合、そのインデックスエントリも削除されます。
構文
TFT.DELDOCFIELD index doc_id field [field1 field2 ...]
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*doc_id* |
はい |
ドキュメントの ID。 |
|
*field* |
はい |
削除する 1 つ以上のフィールド名。 |
指定されたフィールドがドキュメントに存在しない場合 (たとえば、_source によってフィルターで除外されたフィールドなど)、操作は失敗します。
戻り値
-
成功時:削除されたフィールドの数 (整数)
-
失敗時:エラーメッセージ
例
TFT.DELDOCFIELD idx:product 00011 product_group(integer) 1
関連ドキュメント:TFT.UPDATEDOCFIELD
TFT.INCRLONGDOCFIELD
ドキュメント内の整数フィールドをインクリメントします。フィールドの型は LONG または INTEGER である必要があります。ARRAY データ型はサポートされていません。
構文
TFT.INCRLONGDOCFIELD index doc_id field increment
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*doc_id* |
はい |
ドキュメントの ID。 |
|
*field* |
はい |
増分するフィールド。 |
|
*increment* |
はい |
増分値。正または負の整数にできます。 |
ドキュメントが存在しない場合は、増分を適用する前にドキュメントが自動作成され、そのフィールドは0に初期化されます。フィールドがドキュメントに存在しない場合 (たとえば、_sourceによってフィルターアウトされたフィールドなど)、操作は失敗します。
戻り値
-
成功時:更新されたフィールド値 (整数)
-
失敗時:エラーメッセージ
例
TFT.INCRLONGDOCFIELD idx:product 00011 stock 100(integer)100
関連ドキュメント:TFT.INCRFLOATDOCFIELD、TFT.UPDATEDOCFIELD
TFT.INCRFLOATDOCFIELD
ドキュメント内の浮動小数点フィールドをインクリメントします。フィールドは DOUBLE 型である必要があります。ARRAY データ型はサポートされていません。
構文
TFT.INCRFLOATDOCFIELD index doc_id field increment
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*doc_id* |
はい |
ドキュメントの ID。 |
|
*field* |
はい |
増分対象のフィールド。 |
|
*increment* |
はい |
増分値。正または負の浮動小数点数にできます。 |
ドキュメントが存在しない場合、増分を適用する前にドキュメントが自動作成され、フィールドは0に初期化されます。ドキュメントにフィールドが存在しない場合 (たとえば、_sourceによってフィルターで除外されたフィールドなど)、操作は失敗します。
戻り値
-
成功時:更新されたフィールド値 (文字列)
-
失敗時:エラーメッセージ
例
TFT.INCRFLOATDOCFIELD idx:product 00011 stock 299.6"299.6"
関連ドキュメント:TFT.INCRLONGDOCFIELD、TFT.UPDATEDOCFIELD
TFT.GETDOC
ID でドキュメントを取得します。
構文
TFT.GETDOC index doc_id
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*doc_id* |
はい |
ドキュメントの ID。 |
戻り値
-
成功時:ドキュメント ID とコンテンツを含む JSON オブジェクト
-
失敗時:エラーメッセージ
例
TFT.GETDOC idx:product 00011{"_id":"00011","_source":{"product_id":"test8"}}
関連ドキュメント:TFT.EXISTS、TFT.SEARCH
TFT.EXISTS
インデックス内にドキュメントが存在するかどうかをチェックします。
構文
TFT.EXISTS index doc_id
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*doc_id* |
はい |
ドキュメントの ID。 |
戻り値
-
1ドキュメントが存在する場合 -
インデックスまたはドキュメントが存在しない場合は
0 -
失敗時:エラーメッセージ
例
TFT.EXISTS idx:product 00011(integer) 1
関連ドキュメント:TFT.GETDOC、TFT.DOCNUM
TFT.DOCNUM
インデックス内のドキュメント数を取得します。
構文
TFT.DOCNUM index
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
戻り値
-
成功時:ドキュメント数 (整数)
-
失敗時:エラーメッセージ
例
TFT.DOCNUM idx:product(integer) 3
関連ドキュメント:TFT.EXISTS、TFT.SCANDOCID
TFT.SCANDOCID
Redis の SCAN コマンドと同様に、カーソルを使用してインデックス内のドキュメント ID をスキャンします。
構文
TFT.SCANDOCID index cursor [MATCH *value*] [COUNT count]
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*cursor* |
はい |
カーソル位置。新しいスキャンを開始するには、 |
|
|
いいえ |
ドキュメント ID をフィルターするための glob スタイルのパターン。例: |
|
|
いいえ |
1回のスキャンで返されるアイテムの最大数。デフォルト: |
戻り値
2 つの要素からなる配列:
-
次の反復用のカーソル。
0はスキャンが完了したことを示します。 -
ドキュメント ID の配列。
例
TFT.SCANDOCID idx:product 0 COUNT 31) "0"
2) 1) "00001"
2) "00011"
3) "00012"
関連ドキュメント:TFT.DOCNUM、TFT.GETDOC
TFT.DELDOC
ドキュメント ID でインデックスから 1 つ以上のドキュメントを削除します。
構文
TFT.DELDOC index doc_id [doc_id] ...
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*doc_id* |
はい |
削除する 1 つ以上のドキュメント ID。 |
戻り値
-
成功時:実際に削除されたドキュメントの数 (文字列)。存在しない ID は無視されます。
-
失敗時:エラーメッセージ
例
TFT.DELDOC idx:product 00011 00014"1" # ドキュメント 00014 は存在しないため、ドキュメント 00011 のみが削除されます。
関連ドキュメント:TFT.DELALL、TFT.ADDDOC
TFT.DELALL
インデックスとそのマッピングを保持したまま、インデックスからすべてのドキュメントを削除します。
構文
TFT.DELALL index
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
戻り値
-
成功時:
OK -
失敗時:エラーメッセージ
例
TFT.DELALL idx:productOK
関連ドキュメント:TFT.DELDOC、DEL
TFT.ANALYZER
アナライザが指定されたテキストをどのようにトークン化するかをテストします。
構文
TFT.ANALYZER analyzer_name text [INDEX index_name] [SHOW_TIME]
パラメーター
|
パラメーター |
必須 |
説明 |
|
*analyzer_name* |
はい |
組み込みまたはカスタムアナライザの名前。 |
|
*text* |
はい |
トークン化するテキスト。UTF-8 でエンコードされている必要があります。 |
|
|
条件付き |
アナライザ定義を含むインデックス。カスタムアナライザまたは変更されたストップワードや辞書を持つ組み込みアナライザを使用する場合に必須です。 |
|
|
いいえ |
出力にトークナイゼーションの持続時間をマイクロ秒単位で含めます。大規模な辞書 (例:Jieba、IK) を使用した最初の実行は、辞書のロードに数秒かかる場合があります。 |
戻り値
-
成功時:トークンの詳細を含む JSON オブジェクト
-
失敗時:エラーメッセージ
例
TFT.ANALYZER standard "Tair is a nosql database"{
"tokens": [
{"token": "Tair", "start_offset": 0, "end_offset": 4, "position": 0},
{"token": "nosql", "start_offset": 10, "end_offset": 15, "position": 3},
{"token": "database", "start_offset": 16, "end_offset": 24, "position": 4}
]
}
DEL (ネイティブ Redis)
ネイティブ Redis の DEL コマンドを使用して、1 つまたは複数の TairSearch キー (インデックス) を削除します。
DEL key [key ...]
詳細については、「DEL コマンドリファレンス」をご参照ください。
TFT.SEARCH
クエリ DSL を使用してインデックス内のドキュメントを検索します。
構文
TFT.SEARCH index query
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*query* |
はい |
JSON クエリ DSL 文。完全な構文については、以下のセクションをご参照ください。 |
クエリ構文は Elasticsearch クエリ DSL に似ています。
戻り値
成功時、検索結果を含む JSON オブジェクト:
{
"hits": {
"hits": [
{"_id": "...", "_index": "...", "_score": 1.0, "_source": {...}}
],
"max_score": 1.0,
"total": {
"relation": "eq",
"value": 3
}
}
}
total.relation フィールドは、カウントが total.value とどのように関連するかを示します:
-
"eq"-- カウントは正確です。 -
"gte"-- 件数はこの値以上です (track_total_hitsがfalseの場合)。
例
TFT.SEARCH idx:product '{"sort":[{"price":{"order":"desc"}}]}'{"hits":{"hits":[{"_id":"fruits_3","_index":"idx:product","_score":1.0,"_source":{"product_id":"fruits_3","product_name":"orange","price":30.2,"stock":3000}},{"_id":"fruits_2","_index":"idx:product","_score":1.0,"_source":{"product_id":"fruits_2","product_name":"banana","price":24.0,"stock":2000}},{"_id":"fruits_1","_index":"idx:product","_score":1.0,"_source":{"product_id":"fruits_1","product_name":"apple","price":19.5,"stock":1000}}],"max_score":1.0,"total":{"relation":"eq","value":3}}}
関連ドキュメント:TFT.MSEARCH、TFT.EXPLAINCOST、TFT.EXPLAINSCORE
クエリの型
クエリ DSL の query フィールドは、以下のクエリタイプをサポートします。
ソート
sort フィールドを使用して結果の並び順を制御します。ARRAY データの型はソートにはサポートされていません。
|
値 |
説明 |
|
|
関連性スコアの降順でソートします。 |
|
|
ドキュメント ID の昇順でソートします。 |
|
*field_name* |
特定のフィールドで昇順にソートします。フィールドは、インデックス付け ( |
複数フィールドのソートには、配列を使用します。ソート方向は order ("desc" または "asc") で制御します:
{"sort": [{"price": {"order": "desc"}}, {"_doc": {"order": "desc"}}]}
ソースフィルタリング
_source フィールドを使用して、結果に表示されるドキュメントフィールドを制御します:
{"_source": {"includes": ["f0"]}}
includes と excludes の両方で、ワイルドカードパターンがサポートされています。
ページング
|
パラメーター |
型 |
説明 |
デフォルト |
|
|
INTEGER |
返す最初の結果の 0 から始まるオフセット。 |
|
|
|
INTEGER |
返す結果の最大数。有効値: |
|
fromとsizeを併用することでページングを実現します。fromの値が大きくなるほど、クエリのパフォーマンスは低下します。
track_total_hits
term、terms、または match クエリに一致するすべてのドキュメントをカウントするかどうかを制御します (複合クエリもサポートされていますが、match 内のあいまい一致は無効になります)。
|
値 |
動作 |
|
|
スコアでソートされた上位 100 件のドキュメントのみを返します。 |
|
|
一致するすべてのドキュメントをカウントします。 |
一致するドキュメントが多数ある場合に track_total_hits を true に設定すると、クエリが低速になる可能性があります。注意してご使用ください。
TFT.MSEARCH
同一のマッピングと設定を共有する複数のインデックスを横断検索し、結果を集約して返します。
構文
TFT.MSEARCH index_count index [index1] ... query
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index_count* |
はい |
検索するインデックスの数。有効値: |
|
*index* |
はい |
1 つ以上のインデックス名。すべてのインデックスで |
|
*query* |
はい |
JSON クエリ DSL 文。 |
TFT.MSEARCHはfromパラメーターをサポートしていません。代わりにカーソルベースのページングを使用してください (下記参照)。
カーソルベースのページング
ページングには、size、reply_with_keys_cursor、keys_cursor を一緒に使用します:
|
パラメーター |
型 |
説明 |
デフォルト |
|
|
INTEGER |
ページごとに返す結果の数。 |
|
|
|
BOOLEAN |
応答にカーソル位置を含めます。 |
|
|
|
OBJECT |
直前のクエリのカーソル位置。最初のクエリでは |
|
仕組み:
-
最初のクエリ:
reply_with_keys_cursorをtrueに設定し、keys_cursorを省略するか、0に設定します。 Tair は、各インデックスからsize件のドキュメントを取得し、結合された結果を収集、スコアリング、ソート、集計して、上位size件のドキュメントを返します。 応答には、各インデックスのkeys_cursorの位置が含まれます。 -
次のクエリ: 前の応答から返された
keys_cursorを渡します。 Tair は各インデックスのカーソル位置から取得を続行します。
集約の動作
TFT.MSEARCH は、結合されたデータセットを集約するのではなく、各インデックスから子結果セットを集約します:
-
レートとソート:子結果セットをスコアリングおよびソートします。
-
sum, max, min, avg, value_count:子結果セット全体で集約します。
-
sum_of_squares, variance, std_deviation:子結果セット全体で平均化します。
-
Terms 集約とフィルター集約:子結果セットを個別に集約します。
戻り値
成功すると、TFT.SEARCH の出力と同様の JSON オブジェクトに aux_info フィールドを追加したものが返されます:
{
"aux_info": {
"index_crc64": 15096806844241479487,
"keys_cursor": {"key0": 2, "key1": 5, "key2": 3},
"field_type": {"f0": "long"}
}
}
|
フィールド |
説明 |
|
|
マッピングと設定の CRC-64 ハッシュ。ビジネスリクエストでは無視できます。 |
|
|
次のページングクエリ用のカーソル位置です。 |
|
|
ソートされたフィールドのデータ型。インデックスフィールドでソートする場合にのみ含まれます。 |
例
同じマッピングを持つ 3 つのインデックスを設定します:
TFT.CREATEINDEX key0 '{"mappings":{"properties":{"f0":{"type":"long"}}}}'
TFT.CREATEINDEX key1 '{"mappings":{"properties":{"f0":{"type":"long"}}}}'
TFT.CREATEINDEX key2 '{"mappings":{"properties":{"f0":{"type":"long"}}}}'
TFT.ADDDOC key0 '{"f0":120}'
TFT.ADDDOC key0 '{"f0":130}'
TFT.ADDDOC key1 '{"f0":140}'
TFT.ADDDOC key1 '{"f0":150}'
TFT.ADDDOC key2 '{"f0":160}'
TFT.ADDDOC key2 '{"f0":170}'
最初のページ:
TFT.MSEARCH 3 key0 key1 key2 '{"size":2,"query":{"range":{"f0":{"gt":120,"lte":170}}},"sort":[{"f0":{"order":"desc"}}],"reply_with_keys_cursor":true}'{"hits":{"hits":[{"_id":"16625439765504840","_index":"key2","_score":1.0,"_source":{"f0":170}},{"_id":"16625439741096630","_index":"key2","_score":1.0,"_source":{"f0":160}}],"max_score":1.0,"total":{"relation":"eq","value":5}},"aux_info":{"index_crc64":10084399559244916810,"keys_cursor":{"key0":0,"key1":0,"key2":2}}}
2 ページ目 (前の応答の keys_cursor を渡します):
TFT.MSEARCH 3 key0 key1 key2 '{"size":2,"query":{"range":{"f0":{"gt":120,"lte":170}}},"sort":[{"f0":{"order":"desc"}}],"reply_with_keys_cursor":true,"keys_cursor":{"key0":0,"key1":0,"key2":2}}'{"hits":{"hits":[{"_id":"16625439652681160","_index":"key1","_score":1.0,"_source":{"f0":150}},{"_id":"16625439624704580","_index":"key1","_score":1.0,"_source":{"f0":140}}],"max_score":1.0,"total":{"relation":"eq","value":5}},"aux_info":{"index_crc64":10084399559244916810,"keys_cursor":{"key0":0,"key1":2,"key2":2}}}
関連ドキュメント:TFT.SEARCH
TFT.EXPLAINCOST
クエリの実行時間の内訳を取得します。
構文
TFT.EXPLAINCOST index query
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*query* |
はい |
Query DSL 文 ( |
戻り値
以下のセクションを含む JSON オブジェクト:
|
セクション |
説明 |
|
|
マイクロ秒単位のクエリ実行時間 ( |
|
|
集約時間 (マイクロ秒単位)。集約が指定されていない場合は省略されます。 |
|
|
結果の収集とソートの時間 (マイクロ秒単位) と、コレクタータイプ ( |
例
TFT.EXPLAINCOST idx:product '{"sort":[{"price":{"order":"desc"}}]}'{
"QUERY_COST": {
"query": "MATCHALL_QUERY",
"doc_num": 1,
"time_cost_us": 2
},
"COLLECTOR_COST": {
"collector_type": "CustomSortCollector",
"time_cost_us": 20
}
}
関連ドキュメント:TFT.SEARCH、TFT.EXPLAINSCORE
TFT.EXPLAINSCORE
検索結果の詳細なスコアリングの内訳を取得し、ドキュメントのスコアがどのように計算されるかを示します。
Redis 6.0 以降と互換性のある DRAM ベースのインスタンスでのみ利用可能です。
構文
TFT.EXPLAINSCORE index query [doc_id] ...
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*query* |
はい |
クエリ DSL 文 ( |
|
*doc_id* |
いいえ |
1 つ以上のドキュメント ID。指定した場合、これらのドキュメントのみが出力に含まれます。 |
戻り値
TFT.SEARCH と同じ結果セットに加え、各ドキュメントに以下の情報を含む _explanation オブジェクトが含まれます:
|
フィールド |
説明 |
|
|
ドキュメントのスコア。 |
|
|
スコア計算に使用される数式。 |
|
|
クエリの term に一致するドキュメントフィールド。 |
|
|
ドキュメント内で見つかったクエリの term。 |
|
|
このクエリ句に適用されるスコアリングの重み。 |
|
|
メタデータとステップバイステップのスコアリングプロセス。 |
例
TFT.EXPLAINSCORE today_shares '{"query":{"wildcard":{"shares_name":{"value":"*BY"}}}}'{
"hits": {
"hits": [
{
"_id": "17036492095306830",
"_index": "today_shares",
"_score": 1.0,
"_source": {
"shares_name": "YBY",
"logictime": 14300410,
"purchase_type": 1,
"purchase_price": 11.1,
"purchase_count": 100,
"investor": "Mila"
},
"_explanation": {
"score": 1.0,
"description": "score, computed as query_boost",
"field": "shares_name",
"term": "*BY",
"query_boost": 1.0
}
}
],
"max_score": 1.0,
"total": {"relation": "eq", "value": 1}
}
}
関連ドキュメント:TFT.SEARCH、TFT.EXPLAINCOST
オートコンプリートコマンド
TFT.ADDSUG
関連付けられた重みを持つ 1 つ以上のオートコンプリートテキストエントリを追加します。
構文
TFT.ADDSUG index text weight [text weight] ...
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*text* |
はい |
オートコンプリートのテキストエントリ。 |
|
*weight* |
はい |
スコアリングの重み (正の整数)。重みが大きいほど、結果で上位にランク付けされます。 |
戻り値
-
成功時:追加されたテキストエントリの数 (整数)
-
失敗時:エラーメッセージ
例
TFT.ADDSUG idx:redis 'redis is a memory database' 3 'redis cluster' 10(integer) 2
関連ドキュメント:TFT.GETSUG、TFT.DELSUG、TFT.SUGNUM
TFT.DELSUG
インデックスから 1 つ以上のオートコンプリートテキストエントリを削除します。
構文
TFT.DELSUG index text [text] ...
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*text* |
はい |
削除する正確なテキストエントリ。完全かつ正確な一致である必要があります。 |
戻り値
-
成功時:削除されたテキストエントリの数 (整数)
-
失敗時:エラーメッセージ
例
TFT.DELSUG idx:redis 'redis is a memory database' 'redis cluster'(integer) 2
関連ドキュメント:TFT.ADDSUG、TFT.SUGNUM
TFT.SUGNUM
インデックス内のオートコンプリートテキストエントリの数を取得します。
構文
TFT.SUGNUM index
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
戻り値
-
成功時:エントリ数 (整数)
-
失敗時:エラーメッセージ
例
TFT.SUGNUM idx:redis(integer) 3
関連ドキュメント:TFT.ADDSUG、TFT.GETSUG
TFT.GETSUG
プレフィックスに一致するオートコンプリートの候補を取得します。結果は重みの降順で返されます。
構文
TFT.GETSUG index prefix [MAX_COUNT count] [FUZZY]
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
|
*prefix* |
はい |
一致させるプレフィックス。 |
|
|
いいえ |
返すエントリの最大数。有効な値は |
|
|
いいえ |
あいまい一致を有効にします。 |
戻り値
-
成功時:一致するオートコンプリートテキストエントリのリスト
-
失敗時:エラーメッセージ
例
TFT.GETSUG idx:redis res MAX_COUNT 2 FUZZY1) "redis cluster"
2) "redis lock"
関連ドキュメント:TFT.ADDSUG、TFT.GETALLSUGS
TFT.GETALLSUGS
インデックス内のすべてのオートコンプリートテキストエントリを取得します。
構文
TFT.GETALLSUGS index
パラメーター
|
パラメーター |
必須 |
説明 |
|
*index* |
はい |
インデックスの名前。 |
戻り値
-
成功時:すべてのオートコンプリートテキストエントリのリスト
-
失敗時:エラーメッセージ
例
TFT.GETALLSUGS idx:redis1) "redis cluster"
2) "redis lock"
3) "redis is a memory database"
関連ドキュメント:TFT.GETSUG、TFT.ADDSUG
集約
結果セットに対して集約を実行するには、TFT.SEARCH クエリに aggs (または aggregations) 句を追加します。
基本的な使用法
カスタム集計名、集計タイプ、および集計対象の フィールド を指定します:
TFT.SEARCH shares '{"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Sum":{"sum":{"field":"purchase_price"}}}}'
応答には、query の検索結果と aggs の集約結果の両方が含まれます:
{"hits":{"hits":[{"_id":"16581351808123930","_index":"today_shares0718","_score":1.0,"_source":{"shares_name":"XAX","logictime":14300210,"purchase_type":1,"purchase_price":101.1,"purchase_count":100,"investor":"Jay"}},{"_id":"16581351809626430","_index":"today_shares0718","_score":1.0,"_source":{"shares_name":"XAX","logictime":14300310,"purchase_type":1,"purchase_price":111.1,"purchase_count":100,"investor":"Jay"}}],"max_score":1.0,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Sum":{"value":212.2}}}
ドキュメントを含めずに集約結果のみを返すには、クエリに "size": 0 を追加します。
メトリクス集約
メトリクス集約は、数値フィールド (integer、double など) で数値計算を実行し、ネストされたサブ集約はサポートしません。
|
メトリック |
説明 |
サポートされるフィールド型 |
|
|
フィールド値の合計 |
数値 |
|
|
最大値 |
数値 |
|
|
最小値 |
数値 |
|
|
平均値 |
数値 |
|
|
二乗和 |
数値 |
|
|
統計的分散 |
数値 |
|
|
標準偏差 |
数値 |
|
|
値の数 (重複排除なし) |
数値、 |
|
|
上記のすべてのメトリックを単一の応答で |
数値 |
value_countのみがkeywordフィールドをサポートします。他のすべてのメトリックは数値フィールドを必要とします。
出力:指定されたフィールドから計算された DOUBLE 値。
ターム集約
keyword フィールド内の重複排除された値をカウントします。ネストされたサブ集約に対応しています。
|
パラメーター |
説明 |
デフォルト |
|
|
集約フィールドです。 |
必須 |
|
|
返されるバケットの数。有効値: |
|
|
|
ソート順。 |
|
|
|
結果に含まれるためのバケットの最小ドキュメント数。 |
|
|
|
バケットキーが一致する必要がある正規表現パターンまたは正確な値。文字列フィールドでは、正規表現マッチングがサポートされます。配列フィールドでは、完全一致が必要です。 |
-- |
|
|
バケットキーが一致してはならない正規表現パターンまたは正確な値です。両方の |
-- |
出力: buckets を含む JSON オブジェクト。各バケットには、key (フィールド値) と doc_count (ドキュメント数) が含まれます:
{
"aggregations": {
"Per_Investor_Freq": {
"buckets": [
{"doc_count": 2, "key": "Jay"},
{"doc_count": 1, "key": "Mila"}
]
}
}
}
例:
{"aggs": {"Per_Investor_Freq": {"terms": {"field": "investor"}}}}
フィルター集約
クエリ文でクエリ結果をフィルタリングし、一致するドキュメントをカウントします。ネストされたサブ集約をサポートします。
出力: フィルター条件に一致するドキュメントの数 (doc_count)。
集約の例
以下の例では、株式取引データセットを使用します。
ステップ 1:インデックスの作成
TFT.CREATEINDEX today_shares '{"mappings":{"properties":{"shares_name":{"type":"keyword"},"logictime":{"type":"long"},"purchase_type":{"type":"integer"},"purchase_price":{"type":"double"},"purchase_count":{"type":"long"},"investor":{"type":"keyword"}}}}'
ステップ 2:ドキュメントの追加
TFT.ADDDOC today_shares '{"shares_name":"XAX","logictime":14300210,"purchase_type":1,"purchase_price":101.1,"purchase_count":100,"investor":"Jay"}'
TFT.ADDDOC today_shares '{"shares_name":"XAX","logictime":14300310,"purchase_type":1,"purchase_price":111.1,"purchase_count":100,"investor":"Jay"}'
TFT.ADDDOC today_shares '{"shares_name":"YBY","logictime":14300410,"purchase_type":1,"purchase_price":11.1,"purchase_count":100,"investor":"Mila"}'
ステップ 3:クエリの実行
sum -- 投資家の総購入額
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Sum":{"sum":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Sum":{"value":212.2}}}
max -- 投資家の最高購入価格
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Max":{"max":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Max":{"value":111.1}}}
avg -- 投資家の平均購入価格
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Avg":{"avg":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Avg":{"value":106.1}}}
std_deviation -- 購入価格の標準偏差
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Std_Deviation":{"std_deviation":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Std_Deviation":{"value":5.0}}}
extended_stats -- すべての統計を一度に
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Extended_Stats":{"extended_stats":{"field":"purchase_price"}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Extended_Stats":{"count":2,"sum":212.2,"max":111.1,"min":101.1,"avg":106.1,"sum_of_squares":10221.21,"variance":25.0,"std_deviation":5.0}}}
terms -- 少なくとも 2 つのトランザクションを持つ投資家
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"purchase_type":1}},"aggs":{"Per_Investor_Freq":{"terms":{"field":"investor","min_doc_count":2,"order":{"_key":"desc"}}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":3}},"aggregations":{"Per_Investor_Freq":{"buckets":[{"key":"Jay","doc_count":2}]}}}
ネストされた terms 集約 -- 銘柄ごとのトランザクション数と平均価格
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"purchase_type":1}},"aggs":{"Per_Investor_Freq":{"terms":{"field":"shares_name","include":"[A-Z]+","exclude":["XAX"]},"aggs":{"Price_Avg":{"avg":{"field":"purchase_price"}}}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":3}},"aggregations":{"Per_Investor_Freq":{"buckets":[{"key":"YBY","doc_count":1,"Price_Avg":{"value":11.1}}]}}}
ネストされたフィルター集約 -- 投資家によるフィルターと拡張統計
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"purchase_type":1}},"aggs":{"Jay_BuyIn_Filter":{"filter":{"term":{"investor":"Jay"}},"aggs":{"Jay_BuyIn_Quatation":{"extended_stats":{"field":"purchase_price"}}}}}}'{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":3}},"aggregations":{"Jay_BuyIn_Filter":{"doc_count":2,"Jay_BuyIn_Quatation":{"count":2,"sum":212.2,"max":111.1,"min":101.1,"avg":106.1,"sum_of_squares":10221.21,"variance":25.0,"std_deviation":5.0}}}}