TairSearch est la structure de données native de recherche en texte intégral de Tair. Elle utilise une syntaxe de requête compatible avec Elasticsearch et s'appuie sur le calcul parallèle multicœur ainsi que sur des index inversés optimisés pour la recherche textuelle. Ce livre blanc compare les performances de TairSearch et de RediSearch lors de charges de travail d'écriture, d'écrasement et d'interrogation, afin que vous puissiez évaluer les écarts de performance et reproduire ces résultats dans votre propre environnement. Toutes les commandes, configurations d'environnement et sources de données de test sont fournies pour permettre une vérification indépendante des résultats.
Pour consulter la documentation de l'API TairSearch, reportez-vous à la rubrique Recherche.
Environnement de test
Client
| Élément | Description |
|---|---|
| Hôte | Instance Elastic Compute Service (ECS) de type ecs.g7.8xlarge. Pour plus d'informations, consultez la rubrique Présentation des familles d'instances. |
| Région et zone | Zone K de la région Chine (Hangzhou) |
| Système d'exploitation | CentOS 7.9 64 bits |
Bases de données
Les deux bases de données s'exécutent sur la même instance ECS et utilisent 6 vCPU ainsi que 4 threads d'E/S.
Tableau 1. Base de données Tair autogérée
| Élément | Description |
|---|---|
| Version de Tair | Instance basée sur la DRAM compatible Redis 5.0, version 5.0.30 |
| Threads d'E/S | 4 |
| CPU | 6 vCPU. Exemple de commande : taskset -c 1-6 ./src/redis-server redis.conf. |
Tableau 2. Base de données Redis autogérée
| Élément | Description |
|---|---|
| Version de Redis | 7.0.10 |
| Version de RediSearch | 2.6.6. Le paramètre CONCURRENT_WRITE_MODE est défini sur true. |
| Version de RedisJSON | 2.4.6 |
| Threads d'E/S | 4 |
| CPU | 6 vCPU. Exemple de commande : taskset -c 1-6 ./src/redis-server redis.conf. |
Données de test
Le jeu de données de test contient des résumés d'articles Wikipédia en chinois et en anglais issus de Wikimedia. Fichiers sources : Index of /zhwiki/latest/ et Index of /enwiki/latest/.
Chaque document comprend quatre champs : id, title, url et abstract. Exemples :
{
"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": "哲学()是研究普遍的、基本问题的学科,包括存在、知识、价值、理智、心灵、语言等领域。哲学与其他学科不同之处在於哲学有独特之思考方式,例如批判的方式、通常是系统化的方法,并以理性论证为基础。"
}
Outil de test
Téléchargez le binaire TairSearchBench adapté à votre système d'exploitation :
Darwin : TairSearchBench.Darwin
Linux : TairSearchBench.Linux
Windows : TairSearchBench.Windows
Exécutez ./TairSearchBench.Linux --help pour afficher toutes les options disponibles.
Usage of ./TairSearchBench.linux:
-a string
The address(ip:port) of network to connect
# The endpoint of the instance.
-c int
Benchmark concurrency (default 30)
# The number of tests that can be run concurrently. Default value: 30.
-d uint
Specify the number of seconds for the benchmark (default 30)
# The duration of the test. When the duration ends, the test is terminated. Default value: 30. Unit: seconds.
-e string
The engine backend to run [tairsearch/redisearch]
# Specify TairSearch or RediSearch as the engine that the instance runs.
-f string
Input file to ingest data from (wikipedia abstracts)
# The path of the execution data file.
-h string
Print usage (default "help")
# Display the usage of the tool.
-j string
Specify the big json file to write
# Specify the path of the JSON file to be written.
-n uint
Specify the number of times to benchmark (default 100000)
# The total number of operations to perform for a test. Default value: 100000.
-o int
Overwrite the doc (We will write the document with the same document id)
# Specify whether to overwrite the original document. Valid values: 1 (true) and 0 (false). Default value: 0.
-p string
The password of redis to connect
# The password of the instance.
-q string
Search query string to benchmark
# The query statement that is used to run tests.
-s uint
Specify the compress threshold for tairsearch (default 10000000000)
# Specify the compression threshold for TairSearch. If the size of a document exceeds the threshold, the document is compressed. Unit: bytes. Default value: 10000000000 (10 KB).
-t string
Specify the type of benchmark [write/search/readwrite]
# Set the test type to write, search, or readwrite.
-z string
Specify the analyzer to use for query (default "standard")
# Specify the analyzer for the query. Default value: standard.
Allouez 20 vCPU au client avant d'exécuter les tests. Exemple de commande : taskset -c 10-30 ./TairSearchBench.linux.
Préparatifs
Créez un schéma (index) avant d'exécuter tout test.
-
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 NUMERICSi les données de test sont des documents en chinois, ajoutez
LANGUAGE CHINESEau schéma précédent.
Résultats des tests
Chaque test d'écriture indexe 1 000 000 de documents. Chaque test d'interrogation exécute 1 000 000 de requêtes sur un corpus de 1 000 000 de documents. Chaque test mixte (readwrite) dure 60 secondes.
Écriture de données en anglais
Commandes
-
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:6379 -
RediSearch
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
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) | Mémoire utilisée (Go) |
|---|---|---|---|---|
| TairSearch | 22 615,15 | 0,874 | 1,735 | 1,39 |
| RediSearch | 18 295,10 | 1,092 | 2,352 | 1,67 |
Écriture de données en chinois
Commandes
-
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 jieba -
RediSearch
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
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) | Mémoire utilisée (Go) |
|---|---|---|---|---|
| TairSearch | 13 980,41 | 1,427 | 3,275 | 1,87 |
| RediSearch | 10 924,40 | 1,830 | 3,857 | 1,83 |
Dans ce test, TairSearch consomme plus de mémoire que RediSearch, car l'analyseur jieba génère des jetons plus fins que l'analyseur chinois utilisé par RediSearch.
Écrasement de données en anglais
Commandes
-
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:6379 -
RediSearch
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
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) | Mémoire utilisée (Go) |
|---|---|---|---|---|
| TairSearch | 9 775,03 | 2,041 | 3,974 | 0,0002 |
| RediSearch | 22 239,67 | 0,898 | 1,38 | 0,165 |
Lors d'une opération d'écrasement, RediSearch marque le document original pour une suppression ultérieure, ce qui entraîne une consommation supplémentaire de mémoire. En comparaison, TairSearch supprime le document original en temps réel.
Écrasement de données en chinois
Commandes
-
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 jieba -
RediSearch
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
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) | Mémoire utilisée (Go) |
|---|---|---|---|---|
| TairSearch | 6 194,15 | 3,206 | 6,456 | 0,025 (y compris la mémoire utilisée par le dictionnaire de l'analyseur jieba) |
| RediSearch | 25 096,18 | 0,796 | 1,338 | 0,671 |
Lors d'une opération d'écrasement, RediSearch marque le document original pour une suppression ultérieure, ce qui entraîne une consommation supplémentaire de mémoire. En comparaison, TairSearch supprime le document original en temps réel.
Requête term — Anglais
Commandes
-
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:6379 -
RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:hello" -a 127.0.0.1:6379
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) |
|---|---|---|---|
| TairSearch | 45 501,13 | 0,437 | 0,563 |
| RediSearch | 28 513,87 | 0,700 | 0,833 |
Requête term — Chinois
Commandes
-
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 1000000 -q '{"query":{"term":{"abstract":"你好"}}}' -a 127.0.0.1:6379 -
RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:你好" -a 127.0.0.1:6379
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) |
|---|---|---|---|
| TairSearch | 40 670,47 | 0,489 | 0,635 |
| RediSearch | 24 437,48 | 0,817 | 1,331 |
Requête match — Anglais
Commandes
-
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:6379 -
RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:chinese history" -a 127.0.0.1:6379
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) |
|---|---|---|---|
| TairSearch | 24 548,94 | 0,812 | 0,971 |
| RediSearch | 2 420,66 | 8,261 | 8,523 |
Requête match — Chinois
Commandes
-
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:6379 -
RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 100000 -q "@abstract:中国的历史" -a 127.0.0.1:6379 -analyzer jieba
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) |
|---|---|---|---|
| TairSearch | 6 601,05 | 3,027 | 3,669 |
| RediSearch | 889,37 | 22,486 | 22,985 |
Requête bool — Anglais
Commandes
-
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:6379 -
RediSearch
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
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) |
|---|---|---|---|
| TairSearch | 4 554,22 | 4,388 | 5,702 |
| RediSearch | 1 124,08 | 17,791 | 18,444 |
Requête bool — Chinois
Commandes
-
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:6379 -
RediSearch
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
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) |
|---|---|---|---|
| TairSearch | 2 619,00 | 7,623 | 18,42 |
| RediSearch | 1 199,76 | 16,669 | 17,064 |
Requête range — Anglais
Commandes
-
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:6379 -
RediSearch
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
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) |
|---|---|---|---|
| TairSearch | 2 840,02 | 7,038 | 8,599 |
| RediSearch | 1 307,02 | 15,300 | 16,817 |
Requête prefix — Anglais
Commandes
-
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:6379 -
RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:happiness*" -a 127.0.0.1:6379
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) |
|---|---|---|---|
| TairSearch | 36 491,10 | 0,545 | 0,688 |
| RediSearch | 25 558,92 | 0,781 | 0,930 |
Requête prefix — Chinois
Commandes
-
TairSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e tairsearch -c 20 -n 1000000 -q '{"query":{"prefix":{"abstract":"开心"}}}' -a 127.0.0.1:6379 -
RediSearch
taskset -c 10-30 ./TairSearchBench.linux -t search -e redisearch -c 20 -n 1000000 -q "@abstract:开心*" -a 127.0.0.1:6379 -z chinese
Résultats
| Moteur | QPS | Latence moyenne (ms) | Latence au 99e percentile (ms) |
|---|---|---|---|
| TairSearch | 41 308,71 | 0,481 | 0,638 |
| RediSearch | 27 457,86 | 0,727 | 1,234 |
Mixte : écriture + requête term
Commandes
-
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:6379 -
RediSearch
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
Résultats
| Moteur | QPS d'écriture moyen | Latence d'écriture moyenne (ms) | QPS de requête moyen | Latence de requête moyenne (ms) |
|---|---|---|---|---|
| TairSearch | 14 699,77 | 1,359 | 16 224,03 | 1,232 |
| RediSearch | 11 386,75 | 1,755 | 11 386,70 | 1,755 |
Mixte : écriture + requête bool
Commandes
-
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:6379 -
RediSearch
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
Résultats
| Moteur | QPS d'écriture moyen | Latence d'écriture moyenne (ms) | QPS de requête moyen | Latence de requête moyenne (ms) |
|---|---|---|---|---|
| TairSearch | 9 589,18 | 2,085 | 10 504,31 | 1,903 |
| RediSearch | 5 284,01 | 3,784 | 5 283,96 | 3,784 |
Résumé
TairSearch offre un débit supérieur et une latence réduite par rapport à RediSearch pour la plupart des types de requêtes, grâce à deux choix de conception fondamentaux :
Calcul parallèle multicœur : TairSearch répartit l'intersection des index et l'évaluation des requêtes sur plusieurs cœurs CPU, ce qui s'avère particulièrement efficace pour les requêtes complexes telles que match, bool et range, qui nécessitent l'intersection de multiples listes de posting.
Index inversés optimisés pour la recherche textuelle : La structure d'index est conçue spécifiquement pour les charges de travail en texte intégral, permettant des recherches rapides par terme unique et des opérations AND multi-termes efficaces.
TairSearch utilise également une structure de données dédiée pour la compression des documents, réduisant ainsi l'utilisation de la mémoire sans dégrader le débit en lecture ou en écriture.