O TairSearch é a estrutura de dados de pesquisa de texto completo desenvolvida internamente pelo Tair. Ele usa sintaxe de consulta compatível com o Elasticsearch e baseia-se em computação paralela multinúcleo e índices invertidos otimizados para pesquisa de texto. Este whitepaper compara o desempenho do TairSearch com o RediSearch em cargas de trabalho de gravação, sobrescrita e consulta, permitindo que você avalie as diferenças de desempenho e reproduza os resultados em seu próprio ambiente. Fornecemos todos os comandos, configurações de ambiente e fontes de dados de teste para que você possa verificar os resultados de forma independente.
Para a documentação da API do TairSearch, consulte Search.
Ambiente de teste
Cliente
|
Item |
Descrição |
|
Host |
Instância do Elastic Compute Service (ECS) do tipo ecs.g7.8xlarge. Para obter mais informações, consulte Visão geral das famílias de instâncias. |
|
Região e zona |
Zona K na região China (Hangzhou) |
|
Sistema operacional |
CentOS 7.9 64 bits |
Bancos de dados
Ambos os bancos de dados operam na mesma instância ECS e utilizam 6 vCPUs e 4 threads de E/S.
Tabela 1. Banco de dados Tair autogerenciado
|
Item |
Descrição |
|
Versão do Tair |
Instância baseada em DRAM compatível com Redis 5.0, versão 5.0.30 |
|
Threads de E/S |
4 |
|
CPU |
6 vCPUs. Comando de exemplo: |
Tabela 2. Banco de dados Redis autogerenciado
|
Item |
Descrição |
|
Versão do Redis |
7.0.10 |
|
Versão do RediSearch |
2.6.6. O parâmetro CONCURRENT_WRITE_MODE está definido como true. |
|
Versão do RedisJSON |
2.4.6 |
|
Threads de E/S |
4 |
|
CPU |
6 vCPUs. Comando de exemplo: |
Dados de teste
O conjunto de dados de teste contém resumos de artigos da Wikipédia em chinês e inglês da Wikimedia. Arquivos de origem: Index of /zhwiki/latest/ e Index of /enwiki/latest/.
Cada documento contém quatro campos: id, title, url e abstract. Exemplos:
{
"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": "哲学()是研究普遍的、基本问题的学科,包括存在、知识、价值、理智、心灵、语言等领域。哲学与其他学科不同之处在於哲学有独特之思考方式,例如批判的方式、通常是系统化的方法,并以理性论证为基础。"
}
Ferramenta de teste
Baixe o binário do TairSearchBench para o seu sistema operacional:
Darwin: TairSearchBench.Darwin
Linux: TairSearchBench.Linux
Windows: TairSearchBench.Windows
Execute ./TairSearchBench.Linux --help para ver todas as opções disponíveis.
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.
Aloque 20 vCPUs para o cliente antes de executar os testes. Comando de exemplo: taskset -c 10-30 ./TairSearchBench.linux.
Preparativos
Crie um schema (índice) antes de executar qualquer teste.
-
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 NUMERICSe os dados de teste forem documentos em chinês, adicione
LANGUAGE CHINESEao schema anterior.
Resultados dos testes
Cada teste de gravação indexa 1.000.000 de documentos. Cada teste de consulta executa 1.000.000 de consultas em um corpus de 1.000.000 de documentos. Cada teste misto (readwrite) tem duração de 60 segundos.
Gravação de dados em inglês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
Memória utilizada (GB) |
|
TairSearch |
22.615,15 |
0,874 |
1,735 |
1,39 |
|
RediSearch |
18.295,10 |
1,092 |
2,352 |
1,67 |
Gravação de dados em chinês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
Memória utilizada (GB) |
|
TairSearch |
13.980,41 |
1,427 |
3,275 |
1,87 |
|
RediSearch |
10.924,40 |
1,830 |
3,857 |
1,83 |
O TairSearch usa mais memória que o RediSearch neste teste porque o analisador jieba produz tokens mais granulares do que o analisador de chinês usado pelo RediSearch.
Sobrescrita de dados em inglês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
Memória utilizada (GB) |
|
TairSearch |
9.775,03 |
2,041 |
3,974 |
0,0002 |
|
RediSearch |
22.239,67 |
0,898 |
1,38 |
0,165 |
Durante a sobrescrita, o RediSearch marca o documento original para exclusão posterior, o que causa uso adicional de memória. Em comparação, o TairSearch exclui o documento original em tempo real.
Sobrescrita de dados em chinês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
Memória utilizada (GB) |
|
TairSearch |
6.194,15 |
3,206 |
6,456 |
0,025 (incluindo a memória utilizada pelo dicionário do analisador jieba) |
|
RediSearch |
25.096,18 |
0,796 |
1,338 |
0,671 |
Durante a sobrescrita, o RediSearch marca o documento original para exclusão posterior, o que causa uso adicional de memória. Em comparação, o TairSearch exclui o documento original em tempo real.
Consulta term — inglês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
|
TairSearch |
45.501,13 |
0,437 |
0,563 |
|
RediSearch |
28.513,87 |
0,700 |
0,833 |
Consulta term — chinês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
|
TairSearch |
40.670,47 |
0,489 |
0,635 |
|
RediSearch |
24.437,48 |
0,817 |
1,331 |
Consulta match — inglês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
|
TairSearch |
24.548,94 |
0,812 |
0,971 |
|
RediSearch |
2.420,66 |
8,261 |
8,523 |
Consulta match — chinês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
|
TairSearch |
6.601,05 |
3,027 |
3,669 |
|
RediSearch |
889,37 |
22,486 |
22,985 |
Consulta bool — inglês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
|
TairSearch |
4.554,22 |
4,388 |
5,702 |
|
RediSearch |
1.124,08 |
17,791 |
18,444 |
Consulta bool — chinês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
|
TairSearch |
2.619,00 |
7,623 |
18,42 |
|
RediSearch |
1.199,76 |
16,669 |
17,064 |
Consulta range — inglês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
|
TairSearch |
2.840,02 |
7,038 |
8,599 |
|
RediSearch |
1.307,02 |
15,300 |
16,817 |
Consulta prefix — inglês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
|
TairSearch |
36.491,10 |
0,545 |
0,688 |
|
RediSearch |
25.558,92 |
0,781 |
0,930 |
Consulta prefix — chinês
Comandos
-
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
Resultados
|
Motor |
QPS |
Latência média (ms) |
Latência no percentil 99 (ms) |
|
TairSearch |
41.308,71 |
0,481 |
0,638 |
|
RediSearch |
27.457,86 |
0,727 |
1,234 |
Misto: gravação + consulta term
Comandos
-
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
Resultados
|
Motor |
QPS médio de gravação |
Latência média de gravação (ms) |
QPS médio de consulta |
Latência média de consulta (ms) |
|
TairSearch |
14.699,77 |
1,359 |
16.224,03 |
1,232 |
|
RediSearch |
11.386,75 |
1,755 |
11.386,70 |
1,755 |
Misto: gravação + consulta bool
Comandos
-
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
Resultados
|
Motor |
QPS médio de gravação |
Latência média de gravação (ms) |
QPS médio de consulta |
Latência média de consulta (ms) |
|
TairSearch |
9.589,18 |
2,085 |
10.504,31 |
1,903 |
|
RediSearch |
5.284,01 |
3,784 |
5.283,96 |
3,784 |
Resumo
O TairSearch oferece maior throughput e menor latência que o RediSearch na maioria dos tipos de consulta devido a duas escolhas principais de design:
Computação paralela multinúcleo: o TairSearch distribui a interseção de índices e a avaliação de consultas entre múltiplos núcleos de CPU. Isso é particularmente eficaz para consultas complexas como match, bool e range, pois essas consultas precisam intersectar várias listas de postagem.
Índices invertidos otimizados para pesquisa de texto: a estrutura do índice é projetada especificamente para cargas de trabalho de texto completo, o que permite buscas rápidas de termos únicos e operações AND eficientes com múltiplos termos.
O TairSearch também usa uma estrutura de dados dedicada para compressão de documentos, o que reduz o uso de memória sem degradar o throughput de leitura ou gravação.