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

Tair (Redis® OSS-Compatible):TairSearch コマンド

最終更新日:Jul 21, 2026

TairSearch は、Tair (Redis OSS 互換) に組み込まれた全文検索モジュールです。Elasticsearch に似たクエリ構文を使用し、ミリ秒レベルの書き込みおよび検索パフォーマンスを提供します。

概要

TairSearch は以下の機能を提供します:

  • 低レイテンシと高性能:Tair のインメモリエンジンによるミリ秒レベルの書き込みと全文検索。詳細については、「TairSearch パフォーマンスホワイトペーパー」をご参照ください。

  • 増分および部分更新:ドキュメント全体を書き換えることなく、個々のドキュメントフィールドの追加、更新、削除、自動インクリメントが可能です。

  • Elasticsearch のようなクエリ構文: boolmatchterm、ページング、ソートをサポートする 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

TFT.MSEARCH コマンド

2023-01-13

V5.0.25

アナライザ

2023-03-15

V5.0.28

クエリキャッシュ、ドキュメント圧縮、TFT.ANALYZER コマンド

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

クエリキャッシュ、ドキュメントの圧縮、TFT.ANALYZER (V5.0.28 のすべての機能)

2023-06-12

V6.2.7.3

ARRAY データ型、Okapi BM25 (V5.0.35 のすべての機能)

2023-12-21

V23.12.1.2

TFT.EXPLAINSCORE コマンド

Redis 7.0 互換 DRAM ベースインスタンス

日付

バージョン

変更点

2024-07-22

V24.7.0.0

TairSearch のサポート

ベストプラクティス

注意事項

  • TairSearch データは Tair インスタンスに保存され、インスタンスのメモリを消費します。

  • メモリ使用量を削減するには:

    • 検索が必要なフィールドにのみ、indextrue に設定します。それ以外のフィールドには、indexfalse に設定します。

    • _sourceincludes/excludes パターンを使用して、必要なドキュメントフィールドのみを保存します。

    • 不要なトークナイゼーションとメモリ使用量の増加を避けるために、適切なアナライザを選択します。

    • 大きなドキュメントにはドキュメント圧縮を有効にします。

  • インデックスあたりのドキュメント数は 500万以内にします。これにより、クラスターインスタンスのデータスキューが防止され、読み取りおよび書き込みリクエストのバランスが保たれ、large キーとホットキーが削減されます。large データセットは複数のインデックスに分割し、TFT.MSEARCH を使用してまとめてクエリします。

構文の規則

規則

意味

UPPERCASE

コマンドキーワード

*italic*

変数

[options]

オプションのパラメーター。角括弧のないパラメーターは必須です。

`A\

B`

相互に排他的なパラメーター。1 つだけ指定してください。

...

先行するパラメーターは繰り返し可能です。


全文検索コマンド

TFT.CREATEINDEX

マッピング定義を持つインデックスを作成します。マッピング構文は、Elasticsearch の明示的なマッピングに似ています。ドキュメントを追加する前に、インデックスを作成する必要があります。

構文

TFT.CREATEINDEX index mappings [settings]
大きなキーを防ぐには、大きなインデックスを同一の mappingssettings を持つより小さなインデックスに分割してから、TFT.MSEARCH でまとめてクエリします。

パラメーター

パラメーター

必須

説明

*index*

はい

作成するインデックスの名前。

*mappings*

はい

JSON 形式のマッピング定義。「マッピングオプション」をご参照ください。

*settings*

いいえ

インデックスの JSON 設定。「インデックス設定」をご参照ください。

マッピングオプション

mappings オブジェクトは、以下のトップレベルフィールドをサポートしています:

dynamic

マッピングモード。有効な値:

  • "strict":データは properties で定義されたフィールドにのみ書き込まれます。未定義のフィールドへの書き込みは失敗します。

  • 指定なし (デフォルト) -- 非厳密モード。システムは、書き込まれたフィールドが properties で定義されているかどうかをチェックしません。

enabled

非インデックスフィールド (indexfalse に設定されている) の型チェックを制御します。有効な値は true (デフォルト) と false です。true の場合、フィールドの型が properties で定義された型と一致しないと、書き込みは失敗します。インデックスフィールドは、この設定に関係なく常に型チェックされます。

_source

元のドキュメントを保存するかどうかを制御します。この設定はインデックス作成には影響しません。

  • enabled -- true (デフォルト) は元のドキュメントを保存し、 false は保存しません。

  • includes -- 含めるフィールド名のパターンの配列。ワイルドカードがサポートされています。

  • excludes -- 除外するフィールド名パターンの配列。ワイルドカードがサポートされています。フィールドが includesexcludes の両方に一致する場合、excludes が優先されます (フィールドは保存されません)。

例:

"_source": {"enabled": true}

これは、すべてのフィールドを保存するデフォルト設定です。 "_source": {"enabled": true, "excludes": [], "includes": []} と同等です。

"_source": {"enabled": true, "excludes": [], "includes": ["id", "name"]}

idname フィールドのみが保存されます。

properties

フィールド定義のコレクション。各フィールドは以下の属性をサポートします:

属性

説明

デフォルト

type

データ型。「フィールドの型」をご参照ください。

必須

index

このフィールドをインデックスに含める (検索対象とする) かどうか。 true または false

true

boost

スコアリングのためのフィールドの重み。正の浮動小数点数。

1

similarity

類似性アルゴリズム: "classic" (TF-IDF) 、または "BM25" (Okapi BM25)。

"classic"

フィールドの型

説明

型固有のオプション

keyword

トークン化されない文字列。完全一致クエリに適しています。

ignore_above: 最大文字列長。デフォルト: 128

text

インデックス付けの前にアナライザによってトークン化される文字列。

analyzersearch_analyzer。「テキストアナライザのオプション」をご参照ください。

long

64 ビット整数。タイムスタンプ (UNIX エポック) に適しています。

--

integer

32 ビット整数。

--

double

64 ビットの浮動小数点数。NaNInf、および -Inf はサポートされていません。

--

配列のサポート:すべてのフィールドタイプは配列に対応しています。型名に [] を付加します。たとえば、keyword[] はキーワードの配列を宣言します。

TFT.CREATEINDEX idx:products '{"mappings":{"properties":{"tags":{"type":"keyword[]"}}}}'

テキストアナライザオプション

オプション

説明

デフォルト

analyzer

インデックス作成に使用されるアナライザです。「組み込みアナライザ」をご参照ください。カスタムアナライザも指定でき、settingsanalysis セクションで設定します。

"standard"

search_analyzer

検索時に使用されるアナライザです。有効な値は analyzer と同じです。

analyzerと同じ

組み込みアナライザ

standard (デフォルト)、 jieba (中国語に推奨、chinese よりも効果的)、 stopIKpatternwhitespacesimplekeywordchinesefrenchdutchrussian

詳細については、「組み込みアナライザ」をご参照ください。

インデックス設定

オプションの settings オブジェクトは、以下のフィールドをサポートしています。

analysis

カスタムアナライザを定義します。詳細については、「カスタムアナライザ」をご参照ください。

index

カスタム類似性アルゴリズムを構成します。これを使用して Okapi BM25 パラメーターをカスタマイズします:

パラメーター

説明

デフォルト

有効な値

k1

term の頻度がスコアにどれだけ影響するかを制御します。値が大きいほど効果が大きくなります。

1.2

0 より大きい

b

ドキュメントの長さがスコアにどれだけ影響するかを制御します。値が大きいほど効果が大きくなります。

0.75

0 から 1

例:

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) アルゴリズムを使用して結果が削除されます。

パラメーター

説明

デフォルト

size

STRING

クエリキャッシュ全体の最大メモリで、"bytes""kb"、および "mb" の単位をサポートしています。 例: "1000" (1,000 バイト)、"10kb""1mb"

制限なし

ttl

INTEGER

キャッシュされた結果の TTL (Time to Live)、単位は秒。

10

例:

"settings": {"queries_cache": {"size": "100mb", "ttl": 3}}
queries_cache はノードレベルのパラメーターです。これを1つのインデックスで構成すると、同じプロセス内の他のすべてのインデックスに影響します。すべてのインデックスで同じ queries_cache 構成を使用してください。

compress_doc

透過的なドキュメント圧縮を構成します。圧縮を有効にすると、CPU 消費量と読み書きレイテンシが増加します。インデックスが大規模 (数 KB 以上) で、ストレージコストが主な懸念事項である場合にのみ有効にしてください。

パラメーター

説明

デフォルト

size

STRING

圧縮しきい値。ドキュメントは、このサイズに達した場合にのみ圧縮されます。単位として "bytes""kb"、および "mb" をサポートしています。

"10kb"

enable

BOOLEAN

圧縮を有効にするかどうか。

false

例:

"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.UPDATEINDEXTFT.GETINDEX


TFT.UPDATEINDEX

インデックスマッピングに新しいフィールドを追加するか、インデックス設定を変更します。

構文

TFT.UPDATEINDEX index mappings [settings]

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

*mappings*

はい

追加する新しい properties フィールド。追加するフィールドのみを指定します。dynamic_source などのトップレベルのマッピングオプションは変更できません。新しいフィールドは、既存のフィールドと競合してはなりません。

*settings*

いいえ

変更済みのインデックス設定。 queries_cachecompress_doc、および index (BM25 の k1/b 値) のみ変更できます。

mappingssettings の完全な構文については、「TFT.CREATEINDEX」をご参照ください。

戻り値

  • 成功時: OK

  • 失敗時:エラーメッセージ

TFT.UPDATEINDEX idx:product '{"mappings":{"properties":{"product_group":{"type":"text","analyzer":"chinese"}}}}'
OK

関連ドキュメント:TFT.CREATEINDEXTFT.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.CREATEINDEXTFT.UPDATEINDEX


TFT.ADDDOC

インデックスに単一のドキュメントを追加します。

構文

TFT.ADDDOC index document [WITH_ID doc_id]

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

*document*

はい

JSON ドキュメント。フィールド値はマッピングで定義されたデータ型と一致する必要があります。

WITH_ID *doc_id*

いいえ

カスタムドキュメント ID (文字列)。省略した場合、ID は自動生成されます。指定した ID が既に存在する場合、既存のドキュメントは上書きされます。

_sourceincludes で設定されている場合、ドキュメントの追加または更新時に、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.MADDDOCTFT.UPDATEDOCFIELDTFT.DELDOC


TFT.MADDDOC

単一のアトミック操作でインデックスに複数のドキュメントを追加します。いずれかのドキュメントのフォーマットが無効な場合、どのドキュメントも追加されません。

構文

TFT.MADDDOC index document doc_id [document1 doc_id1] ...

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

*document*

はい

JSON ドキュメント。フィールド値はマッピングで定義されたデータ型と一致する必要があります。

*doc_id*

はい

ドキュメント ID (文字列)。

_sourceincludes で設定されている場合、ドキュメントを追加または更新する際に、includes にリストされているフィールドのみが保存されます。

戻り値

  • 成功時: OK

  • 失敗時:エラーメッセージ

TFT.MADDDOC idx:product '{"product_id":"test1"}' 00011 '{"product_id":"test2"}' 00012
OK

関連ドキュメント:TFT.ADDDOCTFT.DELDOC


TFT.UPDATEDOCFIELD

ドキュメントの特定のフィールドを更新します。ドキュメントが存在しない場合は作成されます (TFT.ADDDOC に相当)。フィールドが存在しない場合は追加されます。

構文

TFT.UPDATEDOCFIELD index doc_id document

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

*doc_id*

はい

更新するドキュメントの ID。

*document*

はい

更新するフィールドを含む JSON オブジェクト。インデックス付けされたフィールドはマッピングで定義されたデータ型と一致する必要があります。インデックス付けされていないフィールドは任意の型にできます。

_sourceincludes が設定されている場合、ドキュメントの追加または更新時に、includes で指定されたフィールドのみが保存されます。

戻り値

  • 成功時: OK

  • 失敗時:エラーメッセージ

TFT.UPDATEDOCFIELD idx:product 00011 '{"product_id":"test8","product_group":"BOOK"}'
OK

関連ドキュメント:TFT.ADDDOCTFT.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*

はい

増分するフィールド。 LONG 型または INTEGER 型である必要があります。

*increment*

はい

増分値。正または負の整数にできます。

ドキュメントが存在しない場合は、増分を適用する前にドキュメントが自動作成され、そのフィールドは 0 に初期化されます。フィールドがドキュメントに存在しない場合 (たとえば、_source によってフィルターアウトされたフィールドなど)、操作は失敗します。

戻り値

  • 成功時:更新されたフィールド値 (整数)

  • 失敗時:エラーメッセージ

TFT.INCRLONGDOCFIELD idx:product 00011 stock 100
(integer)100

関連ドキュメント:TFT.INCRFLOATDOCFIELDTFT.UPDATEDOCFIELD


TFT.INCRFLOATDOCFIELD

ドキュメント内の浮動小数点フィールドをインクリメントします。フィールドは DOUBLE 型である必要があります。ARRAY データ型はサポートされていません。

構文

TFT.INCRFLOATDOCFIELD index doc_id field increment

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

*doc_id*

はい

ドキュメントの ID。

*field*

はい

増分対象のフィールド。 DOUBLE 型である必要があります。

*increment*

はい

増分値。正または負の浮動小数点数にできます。

ドキュメントが存在しない場合、増分を適用する前にドキュメントが自動作成され、フィールドは 0 に初期化されます。ドキュメントにフィールドが存在しない場合 (たとえば、_source によってフィルターで除外されたフィールドなど)、操作は失敗します。

戻り値

  • 成功時:更新されたフィールド値 (文字列)

  • 失敗時:エラーメッセージ

TFT.INCRFLOATDOCFIELD idx:product 00011 stock 299.6
"299.6"

関連ドキュメント:TFT.INCRLONGDOCFIELDTFT.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.EXISTSTFT.SEARCH


TFT.EXISTS

インデックス内にドキュメントが存在するかどうかをチェックします。

構文

TFT.EXISTS index doc_id

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

*doc_id*

はい

ドキュメントの ID。

戻り値

  • 1 ドキュメントが存在する場合

  • インデックスまたはドキュメントが存在しない場合は 0

  • 失敗時:エラーメッセージ

TFT.EXISTS idx:product 00011
(integer) 1

関連ドキュメント:TFT.GETDOCTFT.DOCNUM


TFT.DOCNUM

インデックス内のドキュメント数を取得します。

構文

TFT.DOCNUM index

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

戻り値

  • 成功時:ドキュメント数 (整数)

  • 失敗時:エラーメッセージ

TFT.DOCNUM idx:product
(integer) 3

関連ドキュメント:TFT.EXISTSTFT.SCANDOCID


TFT.SCANDOCID

Redis の SCAN コマンドと同様に、カーソルを使用してインデックス内のドキュメント ID をスキャンします。

構文

TFT.SCANDOCID index cursor [MATCH *value*] [COUNT count]

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

*cursor*

はい

カーソル位置。新しいスキャンを開始するには、0 を使用します。

MATCH *\*value\**

いいえ

ドキュメント ID をフィルターするための glob スタイルのパターン。例: MATCH *redis*

COUNT *count*

いいえ

1回のスキャンで返されるアイテムの最大数。デフォルト: 100

戻り値

2 つの要素からなる配列:

  1. 次の反復用のカーソル。 0 はスキャンが完了したことを示します。

  2. ドキュメント ID の配列。

TFT.SCANDOCID idx:product 0 COUNT 3
1) "0"
2) 1) "00001"
   2) "00011"
   3) "00012"

関連ドキュメント:TFT.DOCNUMTFT.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.DELALLTFT.ADDDOC


TFT.DELALL

インデックスとそのマッピングを保持したまま、インデックスからすべてのドキュメントを削除します。

構文

TFT.DELALL index

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

戻り値

  • 成功時: OK

  • 失敗時:エラーメッセージ

TFT.DELALL idx:product
OK

関連ドキュメント:TFT.DELDOC、DEL


TFT.ANALYZER

アナライザが指定されたテキストをどのようにトークン化するかをテストします。

構文

TFT.ANALYZER analyzer_name text [INDEX index_name] [SHOW_TIME]

パラメーター

パラメーター

必須

説明

*analyzer_name*

はい

組み込みまたはカスタムアナライザの名前。

*text*

はい

トークン化するテキスト。UTF-8 でエンコードされている必要があります。

INDEX *index_name*

条件付き

アナライザ定義を含むインデックス。カスタムアナライザまたは変更されたストップワードや辞書を持つ組み込みアナライザを使用する場合に必須です。

SHOW_TIME

いいえ

出力にトークナイゼーションの持続時間をマイクロ秒単位で含めます。大規模な辞書 (例: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_hitsfalse の場合)。

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.MSEARCHTFT.EXPLAINCOSTTFT.EXPLAINSCORE


クエリの型

クエリ DSL の query フィールドは、以下のクエリタイプをサポートします。

ソート

sort フィールドを使用して結果の並び順を制御します。ARRAY データの型はソートにはサポートされていません。

説明

"_score"

関連性スコアの降順でソートします。

"_doc"

ドキュメント ID の昇順でソートします。

*field_name*

特定のフィールドで昇順にソートします。フィールドは、インデックス付け (index: true) されているか、型チェックが有効 (enabled: true) になっており、かつ型が keywordlonginteger、または double のいずれかである必要があります。

複数フィールドのソートには、配列を使用します。ソート方向は order ("desc" または "asc") で制御します:

{"sort": [{"price": {"order": "desc"}}, {"_doc": {"order": "desc"}}]}

ソースフィルタリング

_source フィールドを使用して、結果に表示されるドキュメントフィールドを制御します:

{"_source": {"includes": ["f0"]}}

includesexcludes の両方で、ワイルドカードパターンがサポートされています。

ページング

パラメーター

説明

デフォルト

from

INTEGER

返す最初の結果の 0 から始まるオフセット。

0

size

INTEGER

返す結果の最大数。有効値: 010000。値が 0 の場合、ドキュメントは返されずに総数のみが返されます。

10

fromsize を併用することでページングを実現します。from の値が大きくなるほど、クエリのパフォーマンスは低下します。

track_total_hits

termterms、または match クエリに一致するすべてのドキュメントをカウントするかどうかを制御します (複合クエリもサポートされていますが、match 内のあいまい一致は無効になります)。

動作

false

スコアでソートされた上位 100 件のドキュメントのみを返します。

true

一致するすべてのドキュメントをカウントします。

警告

一致するドキュメントが多数ある場合に track_total_hitstrue に設定すると、クエリが低速になる可能性があります。注意してご使用ください。


TFT.MSEARCH

同一のマッピングと設定を共有する複数のインデックスを横断検索し、結果を集約して返します。

構文

TFT.MSEARCH index_count index [index1] ... query

パラメーター

パラメーター

必須

説明

*index_count*

はい

検索するインデックスの数。有効値: 1100

*index*

はい

1 つ以上のインデックス名。すべてのインデックスで マッピング設定 が同一である必要があります。マッピングが異なる場合、またはインデックスが存在しない場合は、エラーが返されます。

*query*

はい

JSON クエリ DSL 文。querysort_sourceaggstrack_total_hitssizereply_with_keys_cursor、およびkeys_cursorをサポートします。

TFT.MSEARCHfrom パラメーターをサポートしていません。代わりにカーソルベースのページングを使用してください (下記参照)。

カーソルベースのページング

ページングには、sizereply_with_keys_cursorkeys_cursor を一緒に使用します:

パラメーター

説明

デフォルト

size

INTEGER

ページごとに返す結果の数。

10

reply_with_keys_cursor

BOOLEAN

応答にカーソル位置を含めます。

false

keys_cursor

OBJECT

直前のクエリのカーソル位置。最初のクエリでは 0 を使用するか、省略可能です。

0

仕組み:

  1. 最初のクエリ: reply_with_keys_cursortrue に設定し、keys_cursor を省略するか、0 に設定します。 Tair は、各インデックスから size 件のドキュメントを取得し、結合された結果を収集、スコアリング、ソート、集計して、上位 size 件のドキュメントを返します。 応答には、各インデックスの keys_cursor の位置が含まれます。

  2. 次のクエリ: 前の応答から返された 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"}
    }
}

フィールド

説明

index_crc64

マッピングと設定の CRC-64 ハッシュ。ビジネスリクエストでは無視できます。

keys_cursor

次のページングクエリ用のカーソル位置です。reply_with_keys_cursortrue の場合にのみ含まれます。

field_type

ソートされたフィールドのデータ型。インデックスフィールドでソートする場合にのみ含まれます。

同じマッピングを持つ 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 文 (TFT.SEARCH と同じ構文)。

戻り値

以下のセクションを含む JSON オブジェクト:

セクション

説明

QUERY_COST

マイクロ秒単位のクエリ実行時間 (time_cost_us) に加え、クエリビュー (query) とドキュメント数 (doc_num) が含まれます。bool クエリの場合は、ステップごとのタイミング (steps) も含まれます。

AGGS_COST

集約時間 (マイクロ秒単位)。集約が指定されていない場合は省略されます。

COLLECTOR_COST

結果の収集とソートの時間 (マイクロ秒単位) と、コレクタータイプ (ScoreCollector (スコアベース) または CustomSortCollector (フィールドベース))。

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.SEARCHTFT.EXPLAINSCORE


TFT.EXPLAINSCORE

検索結果の詳細なスコアリングの内訳を取得し、ドキュメントのスコアがどのように計算されるかを示します。

Redis 6.0 以降と互換性のある DRAM ベースのインスタンスでのみ利用可能です。

構文

TFT.EXPLAINSCORE index query [doc_id] ...

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

*query*

はい

クエリ DSL 文 (TFT.SEARCH と同じ構文)。

*doc_id*

いいえ

1 つ以上のドキュメント ID。指定した場合、これらのドキュメントのみが出力に含まれます。

戻り値

TFT.SEARCH と同じ結果セットに加え、各ドキュメントに以下の情報を含む _explanation オブジェクトが含まれます:

フィールド

説明

score

ドキュメントのスコア。

description

スコア計算に使用される数式。

field

クエリの term に一致するドキュメントフィールド。

term

ドキュメント内で見つかったクエリの term。

query_boost

このクエリ句に適用されるスコアリングの重み。

details

メタデータとステップバイステップのスコアリングプロセス。

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.SEARCHTFT.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.GETSUGTFT.DELSUGTFT.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.ADDSUGTFT.SUGNUM


TFT.SUGNUM

インデックス内のオートコンプリートテキストエントリの数を取得します。

構文

TFT.SUGNUM index

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

戻り値

  • 成功時:エントリ数 (整数)

  • 失敗時:エラーメッセージ

TFT.SUGNUM idx:redis
(integer) 3

関連ドキュメント:TFT.ADDSUGTFT.GETSUG


TFT.GETSUG

プレフィックスに一致するオートコンプリートの候補を取得します。結果は重みの降順で返されます。

構文

TFT.GETSUG index prefix [MAX_COUNT count] [FUZZY]

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

*prefix*

はい

一致させるプレフィックス。

MAX_COUNT *count*

いいえ

返すエントリの最大数。有効な値は 0255 です。

FUZZY

いいえ

あいまい一致を有効にします。

戻り値

  • 成功時:一致するオートコンプリートテキストエントリのリスト

  • 失敗時:エラーメッセージ

TFT.GETSUG idx:redis res MAX_COUNT 2 FUZZY
1) "redis cluster"
2) "redis lock"

関連ドキュメント:TFT.ADDSUGTFT.GETALLSUGS


TFT.GETALLSUGS

インデックス内のすべてのオートコンプリートテキストエントリを取得します。

構文

TFT.GETALLSUGS index

パラメーター

パラメーター

必須

説明

*index*

はい

インデックスの名前。

戻り値

  • 成功時:すべてのオートコンプリートテキストエントリのリスト

  • 失敗時:エラーメッセージ

TFT.GETALLSUGS idx:redis
1) "redis cluster"
2) "redis lock"
3) "redis is a memory database"

関連ドキュメント:TFT.GETSUGTFT.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 を追加します。

メトリクス集約

メトリクス集約は、数値フィールド (integerdouble など) で数値計算を実行し、ネストされたサブ集約はサポートしません。

メトリック

説明

サポートされるフィールド型

sum

フィールド値の合計

数値

max

最大値

数値

min

最小値

数値

avg

平均値

数値

sum_of_squares

二乗和

数値

variance

統計的分散

数値

std_deviation

標準偏差

数値

value_count

値の数 (重複排除なし)

数値、キーワード

extended_stats

上記のすべてのメトリックを単一の応答で

数値

value_count のみが keyword フィールドをサポートします。他のすべてのメトリックは数値フィールドを必要とします。

出力:指定されたフィールドから計算された DOUBLE 値。

ターム集約

keyword フィールド内の重複排除された値をカウントします。ネストされたサブ集約に対応しています。

パラメーター

説明

デフォルト

field

集約フィールドです。keyword フィールドのみがサポートされています。

必須

size

返されるバケットの数。有効値: 165535

10

order

ソート順。 {"_count": "desc"} はドキュメント数でソートします (デフォルト)。 {"_key": "asc"} はフィールド値をアルファベット順にソートします。

{"_count": "desc"}

min_doc_count

結果に含まれるためのバケットの最小ドキュメント数。

1

include

バケットキーが一致する必要がある正規表現パターンまたは正確な値。文字列フィールドでは、正規表現マッチングがサポートされます。配列フィールドでは、完全一致が必要です。

--

exclude

バケットキーが一致してはならない正規表現パターンまたは正確な値です。両方の includeexclude が指定されている場合、include が最初にチェックされ、次に exclude がチェックされます。

--

出力: 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}}}}