TairSearch adalah struktur data pencarian teks lengkap yang dikembangkan oleh Tair. TairSearch menggunakan sintaksis kueri yang kompatibel dengan Elasticsearch dan dibangun di atas komputasi paralel multi-core serta indeks terbalik yang dioptimalkan untuk pencarian teks. Dokumen putih ini membandingkan kinerja TairSearch dengan RediSearch dalam beban kerja penulisan, penimpaan, dan kueri sehingga Anda dapat mengevaluasi perbedaan kinerja dan mereproduksi hasilnya di lingkungan Anda sendiri. Semua perintah, konfigurasi lingkungan, dan sumber data uji disediakan agar hasilnya dapat diverifikasi secara independen.
Untuk dokumentasi API TairSearch, lihat Search.
Lingkungan pengujian
Klien
| Item | Deskripsi |
|---|---|
| Host | Elastic Compute Service (ECS) instans tipe ecs.g7.8xlarge. Untuk informasi lebih lanjut, lihat Ikhtisar keluarga instans. |
| Wilayah dan zona | Zona K di wilayah China (Hangzhou) |
| Sistem operasi | CentOS 7.9 64-bit |
Database
Kedua database berjalan pada instans ECS yang sama dan menggunakan 6 vCPU serta 4 thread I/O.
Tabel 1. Database Tair yang dikelola sendiri
| Item | Deskripsi |
|---|---|
| Versi Tair | Instans berbasis DRAM yang kompatibel dengan Redis 5.0 versi 5.0.30 |
| Thread I/O | 4 |
| CPU | 6 vCPU. Contoh perintah: taskset -c 1-6 ./src/redis-server redis.conf. |
Tabel 2. Database Redis yang dikelola sendiri
| Item | Deskripsi |
|---|---|
| Versi Redis | 7.0.10 |
| Versi RediSearch | 2.6.6. Parameter CONCURRENT_WRITE_MODE diatur ke true. |
| Versi RedisJSON | 2.4.6 |
| Thread I/O | 4 |
| CPU | 6 vCPU. Contoh perintah: taskset -c 1-6 ./src/redis-server redis.conf. |
Data uji
Set data uji berisi ringkasan artikel Wikipedia dalam bahasa Tiongkok dan Inggris dari Wikimedia. File sumber: Index of /zhwiki/latest/ dan Index of /enwiki/latest/.
Setiap dokumen berisi empat bidang: id, title, url, dan abstract. Contoh:
{
"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": "哲学()是研究普遍的、基本问题的学科,包括存在、知识、价值、理智、心灵、语言等领域。哲学与其他学科不同之处在於哲学有独特之思考方式,例如批判的方式、通常是系统化的方法,并以理性论证为基础。"
}Tool pengujian
Unduh biner TairSearchBench untuk sistem operasi Anda:
Darwin: TairSearchBench.Darwin
Linux: TairSearchBench.Linux
Windows: TairSearchBench.Windows
Jalankan ./TairSearchBench.Linux --help untuk melihat semua opsi yang tersedia.
Usage of ./TairSearchBench.linux:
-a string
The address(ip:port) of network to connect
# Titik akhir instans.
-c int
Benchmark concurrency (default 30)
# Jumlah pengujian yang dapat dijalankan secara konkuren. Nilai default: 30.
-d uint
Specify the number of seconds for the benchmark (default 30)
# Durasi pengujian. Ketika durasi berakhir, pengujian dihentikan. Nilai default: 30. Satuan: detik.
-e string
The engine backend to run [tairsearch/redisearch]
# Tentukan TairSearch atau RediSearch sebagai engine yang dijalankan oleh instans.
-f string
Input file to ingest data from (wikipedia abstracts)
# Jalur file data eksekusi.
-h string
Print usage (default "help")
# Menampilkan penggunaan tool.
-j string
Specify the big json file to write
# Tentukan jalur file JSON yang akan ditulis.
-n uint
Specify the number of times to benchmark (default 100000)
# Total jumlah operasi yang dilakukan untuk satu pengujian. Nilai default: 100000.
-o int
Overwrite the doc (We will write the document with the same document id)
# Tentukan apakah akan menimpa dokumen asli. Nilai valid: 1 (true) dan 0 (false). Nilai default: 0.
-p string
The password of redis to connect
# Password instans.
-q string
Search query string to benchmark
# Pernyataan kueri yang digunakan untuk menjalankan pengujian.
-s uint
Specify the compress threshold for tairsearch (default 10000000000)
# Tentukan ambang batas kompresi untuk TairSearch. Jika ukuran dokumen melebihi ambang batas, dokumen tersebut dikompresi. Satuan: byte. Nilai default: 10000000000 (10 KB).
-t string
Specify the type of benchmark [write/search/readwrite]
# Atur jenis pengujian menjadi write, search, atau readwrite.
-z string
Specify the analyzer to use for query (default "standard")
# Tentukan alat analisis untuk kueri. Nilai default: standard.Alokasikan 20 vCPU ke klien sebelum menjalankan pengujian. Contoh perintah: taskset -c 10-30 ./TairSearchBench.Linux.
Persiapan
Buat skema (indeks) sebelum menjalankan pengujian apa pun.
TairSearch
{ "settings": { "compress_doc": { "size": "user-defined compression threshold", "enable": true } }, "mappings": { "properties": { "id": {"type": "keyword"}, "url": {"type": "keyword", "index": false}, "title": {"type": "text", "analyzer": "user-defined analyzer"}, "abstract": {"type": "text", "analyzer": "user-defined 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 NUMERICJika data uji berupa dokumen dalam bahasa Tiongkok, tambahkan
LANGUAGE CHINESEke skema di atas.
Hasil pengujian
Setiap pengujian penulisan mengindeks 1.000.000 dokumen. Setiap pengujian kueri menjalankan 1.000.000 kueri terhadap korpus berisi 1.000.000 dokumen. Setiap pengujian campuran (readwrite) berjalan selama 60 detik.
Menulis data dalam bahasa Inggris
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) | Penggunaan memori (GB) |
|---|---|---|---|---|
| TairSearch | 22.615,15 | 0,874 | 1,735 | 1,39 |
| RediSearch | 18.295,10 | 1,092 | 2,352 | 1,67 |
Menulis data dalam bahasa Tiongkok
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) | Penggunaan memori (GB) |
|---|---|---|---|---|
| TairSearch | 13.980,41 | 1,427 | 3,275 | 1,87 |
| RediSearch | 10.924,40 | 1,830 | 3,857 | 1,83 |
TairSearch menggunakan lebih banyak memori daripada RediSearch dalam pengujian ini karena alat analisis jieba menghasilkan token yang lebih detail halus dibandingkan alat analisis Chinese yang digunakan oleh RediSearch.
Menimpa data dalam bahasa Inggris
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) | Penggunaan memori (GB) |
|---|---|---|---|---|
| TairSearch | 9.775,03 | 2,041 | 3,974 | 0,0002 |
| RediSearch | 22.239,67 | 0,898 | 1,38 | 0,165 |
Saat melakukan operasi penimpaan, RediSearch menandai dokumen asli untuk dihapus nanti. Hal ini menyebabkan penggunaan memori tambahan. Sebaliknya, TairSearch menghapus dokumen asli secara real time.
Menimpa data dalam bahasa Tiongkok
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) | Penggunaan memori (GB) |
|---|---|---|---|---|
| TairSearch | 6.194,15 | 3,206 | 6,456 | 0,025 (termasuk memori yang digunakan oleh kamus alat analisis jieba) |
| RediSearch | 25.096,18 | 0,796 | 1,338 | 0,671 |
Saat melakukan operasi penimpaan, RediSearch menandai dokumen asli untuk dihapus nanti. Hal ini menyebabkan penggunaan memori tambahan. Sebaliknya, TairSearch menghapus dokumen asli secara real time.
Kueri tepat — Bahasa Inggris
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) |
|---|---|---|---|
| TairSearch | 45.501,13 | 0,437 | 0,563 |
| RediSearch | 28.513,87 | 0,700 | 0,833 |
Kueri tepat — Bahasa Tiongkok
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) |
|---|---|---|---|
| TairSearch | 40.670,47 | 0,489 | 0,635 |
| RediSearch | 24.437,48 | 0,817 | 1,331 |
Kueri match — Bahasa Inggris
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) |
|---|---|---|---|
| TairSearch | 24.548,94 | 0,812 | 0,971 |
| RediSearch | 2.420,66 | 8,261 | 8,523 |
Kueri match — Bahasa Tiongkok
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) |
|---|---|---|---|
| TairSearch | 6.601,05 | 3,027 | 3,669 |
| RediSearch | 889,37 | 22,486 | 22,985 |
Kueri bool — Bahasa Inggris
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) |
|---|---|---|---|
| TairSearch | 4.554,22 | 4,388 | 5,702 |
| RediSearch | 1.124,08 | 17,791 | 18,444 |
Kueri bool — Bahasa Tiongkok
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) |
|---|---|---|---|
| TairSearch | 2.619,00 | 7,623 | 18,42 |
| RediSearch | 1.199,76 | 16,669 | 17,064 |
Kueri range — Bahasa Inggris
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) |
|---|---|---|---|
| TairSearch | 2.840,02 | 7,038 | 8,599 |
| RediSearch | 1.307,02 | 15,300 | 16,817 |
Kueri prefix — Bahasa Inggris
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) |
|---|---|---|---|
| TairSearch | 36.491,10 | 0,545 | 0,688 |
| RediSearch | 25.558,92 | 0,781 | 0,930 |
Kueri prefix — Bahasa Tiongkok
Perintah
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
Hasil
| Engine | QPS | Latensi rata-rata (ms) | Latensi persentil ke-99 (ms) |
|---|---|---|---|
| TairSearch | 41.308,71 | 0,481 | 0,638 |
| RediSearch | 27.457,86 | 0,727 | 1,234 |
Campuran: write + kueri tepat
Perintah
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
Hasil
| Engine | Rata-rata write QPS | Rata-rata latensi write (ms) | Rata-rata query QPS | Rata-rata latensi query (ms) |
|---|---|---|---|---|
| TairSearch | 14.699,77 | 1,359 | 16.224,03 | 1,232 |
| RediSearch | 11.386,75 | 1,755 | 11.386,70 | 1,755 |
Campuran: write + kueri bool
Perintah
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
Hasil
| Engine | Rata-rata Write QPS | Rata-rata latensi write (ms) | Rata-rata query QPS | Rata-rata latensi query (ms) |
|---|---|---|---|---|
| TairSearch | 9.589,18 | 2,085 | 10.504,31 | 1,903 |
| RediSearch | 5.284,01 | 3,784 | 5.283,96 | 3,784 |
Ringkasan
TairSearch memberikan throughput lebih tinggi dan latensi lebih rendah dibandingkan RediSearch pada sebagian besar jenis kueri berkat dua pilihan desain inti:
Komputasi paralel multi-core: TairSearch mendistribusikan interseksi indeks dan evaluasi kueri di beberapa core CPU, yang sangat efektif untuk kueri kompleks seperti match, bool, dan range yang perlu menginterseksi beberapa daftar posting.
Indeks terbalik yang dioptimalkan untuk pencarian teks: Struktur indeks dirancang khusus untuk beban kerja teks lengkap, memungkinkan pencarian istilah tunggal yang cepat dan operasi AND multi-istilah yang efisien.
TairSearch juga menggunakan struktur data khusus untuk kompresi dokumen, mengurangi penggunaan memori tanpa menurunkan throughput baca atau tulis.