TairSearch は、Tair が自社開発した全文検索用データ構造です。Elasticsearch 互換のクエリ構文を採用し、テキスト検索に最適化された転置インデックスとマルチコア並列計算に基づいて構築されています。本ホワイトペーパーでは、書き込み、上書き、クエリという各ワークロードにおいて TairSearch と RediSearch のパフォーマンスをベンチマーク比較し、お客様が自環境で結果を評価・再現できるよう支援します。すべてのコマンド、環境構成、テストデータソースを提供しているため、結果は独立して検証可能です。
TairSearch の API ドキュメントについては、「検索」をご参照ください。
テスト環境
クライアント
| 項目 | 説明 |
|---|---|
| ホスト | Elastic Compute Service (ECS) の ecs.g7.8xlarge インスタンスタイプ。詳細については、「インスタンスファミリーの概要」をご参照ください。 |
| リージョンおよびゾーン | 中国 (杭州) リージョンのゾーン K |
| オペレーティングシステム | CentOS 7.9 64 ビット |
データベース
両データベースは同一の ECS インスタンス上で実行され、6 vCPU および 4 I/O スレッドを使用します。
表 1. 自己管理型 Tair データベース
| 項目 | 説明 |
|---|---|
| Tair バージョン | Redis 5.0 互換の DRAM ベースインスタンス(バージョン 5.0.30) |
| I/O スレッド | 4 |
| CPU | 6 vCPU。サンプルコマンド:taskset -c 1-6 ./src/redis-server redis.conf。 |
表 2. 自己管理型 Redis データベース
| 項目 | 説明 |
|---|---|
| Redis バージョン | 7.0.10 |
| RediSearch バージョン | 2.6.6。CONCURRENT_WRITE_MODE パラメーターは true に設定済み。 |
| RedisJSON バージョン | 2.4.6 |
| I/O スレッド | 4 |
| CPU | 6 vCPU。サンプルコマンド:taskset -c 1-6 ./src/redis-server redis.conf。 |
テストデータ
テストデータセットには、Wikimedia から取得した中国語および英語の Wikipedia 記事の概要が含まれます。ソースファイル:「Index of /zhwiki/latest/」および「Index of /enwiki/latest/」。
各ドキュメントには、id、title、url、abstract の 4 つのフィールドがあります。例:
{
"id": "History_of_Pakistan",
"title": "History of Pakistan",
"url": "https://en.wikipedia.org/wiki/History_of_Pakistan",
"abstract": "The history of Pakistan for the period preceding the country's independence in 1947..."
}{
"id": "Wikipedia:哲学",
"title": "Wikipedia:哲学",
"url": "https://zh.wikipedia.org/wiki/%E5%93%B2%E5%AD%A6",
"abstract": "哲学()は研究普遍的、基本問題の学科であり、存在、知識、価値、理智、心、言語などの領域を含む。哲学は他の学問と異なる点として、批判的な思考方法や体系的な手法、そして理性による論証を基礎とする独自の思考様式を持つ。"
}テストツール
ご利用のオペレーティングシステムに対応する TairSearchBench バイナリをダウンロードしてください:
Darwin: TairSearchBench.Darwin
Linux: TairSearchBench.Linux
Windows: TairSearchBench.Windows
./TairSearchBench.Linux --help を実行すると、利用可能なすべてのオプションを確認できます。
./TairSearchBench.linux の使用方法:
-a 文字列
接続先ネットワークのアドレス(IP:ポート)
# インスタンスのエンドポイント。
-c 整数
ベンチマークの同時実行数(デフォルト:30)
# 同時に実行可能なテストの数。デフォルト値:30。
-d 符号なし整数
ベンチマークの実行時間(秒単位、デフォルト:30)
# テストの持続時間。指定時間が経過するとテストは終了します。デフォルト値:30(単位:秒)。
-e 文字列
実行するエンジンバックエンド[tairsearch/redisearch]
# インスタンスで実行するエンジンとして、TairSearch または RediSearch を指定します。
-f 文字列
データ取り込み元の入力ファイル(Wikipedia 概要)
# 実行データファイルのパス。
-h 文字列
使用方法を表示(デフォルト:"help")
# このツールの使用方法を表示します。
-j 文字列
書き込む大規模 JSON ファイルを指定
# 書き込む JSON ファイルのパスを指定します。
-n 符号なし整数
ベンチマーク実行回数(デフォルト:100000)
# テストで実行する操作の総数。デフォルト値:100000。
-o 整数
ドキュメントの上書き(同じドキュメント ID のドキュメントを上書きします)
# 元のドキュメントを上書きするかどうかを指定します。有効な値:1(true)、0(false)。デフォルト値:0。
-p 文字列
Redis への接続パスワード
# インスタンスのパスワード。
-q 文字列
ベンチマーク用の検索クエリ文字列
# テスト実行に使用するクエリ文。
-s 符号なし整数
TairSearch の圧縮しきい値(デフォルト:10000000000)
# TairSearch の圧縮しきい値を指定します。ドキュメントサイズがこのしきい値を超える場合、ドキュメントは圧縮されます。(単位:バイト)デフォルト値:10000000000(10 KB)。
-t 文字列
ベンチマークのタイプを指定[write/search/readwrite]
# テストタイプを write、search、readwrite のいずれかに設定します。
-z 文字列
クエリで使用するアナライザを指定(デフォルト:"standard")
# クエリで使用するアナライザを指定します。デフォルト値:standard。テスト実行前に、クライアントに 20 vCPU を割り当ててください。サンプルコマンド:taskset -c 10-30 ./TairSearchBench.linux。
事前準備
テストを実行する前に、スキーマ(インデックス)を作成します。
TairSearch
{ "settings": { "compress_doc": { "size": "ユーザー定義の圧縮しきい値", "enable": true } }, "mappings": { "properties": { "id": {"type": "keyword"}, "url": {"type": "keyword", "index": false}, "title": {"type": "text", "analyzer": "ユーザー定義のアナライザ"}, "abstract": {"type": "text", "analyzer": "ユーザー定義のアナライザ"}, "url_len": {"type": "integer"}, "abstract_len": {"type": "integer"}, "title_len": {"type": "integer"} } } }RediSearch
SCHEMA $.id AS id TEXT $.url AS url TEXT NOINDEX $.title AS title TEXT $.abstract AS abstract TEXT $.abstract_len AS abstract_len NUMERIC $.url_len AS url_len NUMERIC $.title_len AS title_len NUMERICテストデータが中国語のドキュメントである場合は、上記スキーマに
LANGUAGE CHINESEを追加します。
テスト結果
各書き込みテストでは 1,000,000 ドキュメントをインデックス化します。各クエリテストでは、1,000,000 ドキュメントから構成されるコーパスに対して 1,000,000 回のクエリを実行します。各混合(readwrite)テストは 60 秒間実行されます。
英語データの書き込み
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t write -e tairsearch -f ./enwiki-latest-abstract.xml -c 20 -n 1000000 -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t write -e redisearch -f ./enwiki-latest-abstract.xml -c 20 -n 1000000 -a 127.0.0.1:6379
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) | 使用メモリ(GB) |
|---|---|---|---|---|
| TairSearch | 22,615.15 | 0.874 | 1.735 | 1.39 |
| RediSearch | 18,295.10 | 1.092 | 2.352 | 1.67 |
中国語データの書き込み
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t write -e tairsearch -f ./zhwiki-latest-abstract.xml -c 20 -n 1000000 -a 127.0.0.1:6379 -z jiebaRediSearch
taskset -c 10-30 ./TairSearchBench.linux -t write -e redisearch -f ./zhwiki-latest-abstract.xml -c 20 -n 1000000 -a 127.0.0.1:6379 -z chinese
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) | 使用メモリ(GB) |
|---|---|---|---|---|
| TairSearch | 13,980.41 | 1.427 | 3.275 | 1.87 |
| RediSearch | 10,924.40 | 1.830 | 3.857 | 1.83 |
本テストでは、TairSearch が RediSearch よりも多くのメモリを使用しています。これは、jieba アナライザが RediSearch で使用される中国語アナライザよりも細かいトークンを生成するためです。
英語データの上書き
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t write -e tairsearch -f ./enwiki-latest-abstract.xml -c 20 -n 1000000 -o 1 -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t write -e redisearch -f ./enwiki-latest-abstract.xml -c 20 -n 1000000 -o 1 -a 127.0.0.1:6379
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) | 使用メモリ(GB) |
|---|---|---|---|---|
| TairSearch | 9,775.03 | 2.041 | 3.974 | 0.0002 |
| RediSearch | 22,239.67 | 0.898 | 1.38 | 0.165 |
上書き操作を実行すると、RediSearch は元のドキュメントを後続の削除対象としてマークします。これにより、追加のメモリ使用量が発生します。一方、TairSearch は元のドキュメントをリアルタイムで削除します。
中国語データの上書き
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t write -e tairsearch -f ./zhwiki-latest-abstract.xml -c 20 -n 1000000 -o 1 -a 127.0.0.1:6379 -z jiebaRediSearch
taskset -c 10-30 ./TairSearchBench.linux -t write -e redisearch -f ./zhwiki-latest-abstract.xml -c 20 -n 1000000 -o 1 -a 127.0.0.1:6379
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) | 使用メモリ(GB) |
|---|---|---|---|---|
| TairSearch | 6,194.15 | 3.206 | 6.456 | 0.025(jieba アナライザ辞書のメモリ使用量を含む) |
| RediSearch | 25,096.18 | 0.796 | 1.338 | 0.671 |
上書き操作を実行すると、RediSearch は元のドキュメントを後続の削除対象としてマークします。これにより、追加のメモリ使用量が発生します。一方、TairSearch は元のドキュメントをリアルタイムで削除します。
完全一致検索 — 英語
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 1000000 -q '{"query":{"term":{"abstract":"hello"}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:hello" -a 127.0.0.1:6379
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) |
|---|---|---|---|
| TairSearch | 45,501.13 | 0.437 | 0.563 |
| RediSearch | 28,513.87 | 0.700 | 0.833 |
完全一致検索 — 中国語
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 1000000 -q '{"query":{"term":{"abstract":"你好"}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:你好" -a 127.0.0.1:6379
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) |
|---|---|---|---|
| TairSearch | 40,670.47 | 0.489 | 0.635 |
| RediSearch | 24,437.48 | 0.817 | 1.331 |
部分一致検索 — 英語
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 1000000 -q '{"query":{"match":{"abstract":{"operator":"and","query":"chinese history"}}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:chinese history" -a 127.0.0.1:6379
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) |
|---|---|---|---|
| TairSearch | 24,548.94 | 0.812 | 0.971 |
| RediSearch | 2,420.66 | 8.261 | 8.523 |
マッチクエリ — 中国語
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 100000 -q '{"query":{"match":{"abstract":{"operator":"and","query":"中国的历史"}}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 100000 -q "@abstract:中国的历史" -a 127.0.0.1:6379 -analyzer jieba
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) |
|---|---|---|---|
| TairSearch | 6,601.05 | 3.027 | 3.669 |
| RediSearch | 889.37 | 22.486 | 22.985 |
ブール検索 — 英語
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 100000 -q '{"query":{"bool":{"must":[{"term":{"abstract":"war"}},{"term":{"abstract":"japanese"}},{"range":{"abstract_len":{"gt":500}}}],"must_not":{"term":{"abstract":"America"}},"should":[{"term":{"abstract":"chinese"}},{"term":{"abstract":"china"}}]}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 100000 -q "@abstract:(war japanese -America (chinese|china)) @abstract_len:[500 +inf]" -a 127.0.0.1:6379
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) |
|---|---|---|---|
| TairSearch | 4,554.22 | 4.388 | 5.702 |
| RediSearch | 1,124.08 | 17.791 | 18.444 |
ブール検索 — 中国語
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 100000 -q '{"query":{"bool":{"must":[{"term":{"abstract":"战争"}},{"term":{"abstract":"日本"}},{"range":{"abstract_len":{"gt":500}}}],"must_not":{"term":{"abstract":"美国"}},"should":[{"term":{"abstract":"中国"}},{"term":{"abstract":"亚洲"}}]}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:(日本 -美国 (中国|亚洲)) @abstract_len:[500 +inf]" -a 127.0.0.1:6379 -analyzer jieba
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) |
|---|---|---|---|
| TairSearch | 2,619.00 | 7.623 | 18.42 |
| RediSearch | 1,199.76 | 16.669 | 17.064 |
範囲検索 — 英語
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 1000000 -q '{"query":{"range":{"abstract_len":{"lte":420, "gte":400}}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract_len:[400,420]" -a 127.0.0.1:6379
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) |
|---|---|---|---|
| TairSearch | 2,840.02 | 7.038 | 8.599 |
| RediSearch | 1,307.02 | 15.300 | 16.817 |
プレフィックス検索 — 英語
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 1000000 -q '{"query":{"prefix":{"abstract":"happiness"}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:happiness*" -a 127.0.0.1:6379
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) |
|---|---|---|---|
| TairSearch | 36,491.10 | 0.545 | 0.688 |
| RediSearch | 25,558.92 | 0.781 | 0.930 |
プレフィックス検索 — 中国語
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 1000000 -q '{"query":{"prefix":{"abstract":"开心"}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:开心*" -a 127.0.0.1:6379 -z chinese
結果
| エンジン | QPS | 平均レイテンシ(ms) | 99 パーセンタイルレイテンシ(ms) |
|---|---|---|---|
| TairSearch | 41,308.71 | 0.481 | 0.638 |
| RediSearch | 27,457.86 | 0.727 | 1.234 |
混合: 書き込み + 完全一致検索
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t readwrite -e tairsearch -f ./enwiki-latest-abstract.xml -c 20 -d 60 -q '{"query":{"term":{"abstract":"hello"}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t readwrite -e redisearch -f ./enwiki-latest-abstract.xml -c 20 -d 60 -q "@abstract:hello" -a 127.0.0.1:6379
結果
| エンジン | 平均書き込み QPS | 平均書き込みレイテンシ(ms) | 平均クエリ QPS | 平均クエリレイテンシ(ms) |
|---|---|---|---|---|
| TairSearch | 14,699.77 | 1.359 | 16,224.03 | 1.232 |
| RediSearch | 11,386.75 | 1.755 | 11,386.70 | 1.755 |
混合ワークロード:書き込み + ブール検索
コマンド
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t readwrite -e tairsearch -f ./enwiki-latest-abstract.xml -c 20 -d 60 -q '{"query":{"bool":{"must":[{"term":{"abstract":"war"}},{"term":{"abstract":"japanese"}},{"range":{"abstract_len":{"gt":500}}}],"must_not":{"term":{"abstract":"America"}},"should":[{"term":{"abstract":"chinese"}},{"term":{"abstract":"china"}}]}}}' -a 127.0.0.1:6379RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t readwrite -e redisearch -f ./enwiki-latest-abstract.xml -c 20 -d 60 -q "@abstract:(war japanese -America (chinese|china)) @abstract_len:[500 +inf]" -a 127.0.0.1:6379
結果
| エンジン | 平均書き込み QPS | 平均書き込みレイテンシ(ms) | 平均クエリ QPS | 平均クエリレイテンシ(ms) |
|---|---|---|---|---|
| TairSearch | 9,589.18 | 2.085 | 10,504.31 | 1.903 |
| RediSearch | 5,284.01 | 3.784 | 5,283.96 | 3.784 |
まとめ
TairSearch は、ほとんどのクエリタイプにおいて RediSearch よりも高いスループットと低いレイテンシを実現します。これは、以下の 2 つのコア設計方針によるものです:
マルチコア並列計算:TairSearch は、インデックスのインターセクションおよびクエリ評価処理を複数の CPU コアに分散させます。この設計は、マッチ、ブール、範囲など、複数の投稿リストをインターセクトする必要がある複雑なクエリにおいて特に効果的です。
テキスト検索に最適化された転置インデックス:インデックス構造は、全文検索ワークロードを目的として専門的に設計されており、単一タームの高速検索および効率的なマルチターム AND 操作を可能にします。
さらに、TairSearch はドキュメント圧縮専用のデータ構造を採用しており、読み取りおよび書き込みスループットを劣化させることなくメモリ使用量を削減します。