O TairSearch é um módulo de busca full-text integrado ao Tair (Redis OSS-Compatible). Ele utiliza uma sintaxe de consulta semelhante à do Elasticsearch e oferece desempenho de escrita e busca em nível de milissegundos.
Visão geral
O TairSearch oferece os seguintes recursos:
Baixa latência e alto desempenho: Escrita e busca full-text em nível de milissegundos, impulsionadas pelo mecanismo em memória do Tair. Para mais detalhes, consulte TairSearch performance whitepaper.
Atualizações incrementais e parciais: Adicione, atualize, remova e incremente automaticamente campos individuais de documentos sem reescrever todo o documento.
Sintaxe de consulta semelhante ao Elasticsearch: Query DSL baseada em JSON com suporte a
bool,match,term, paginação e ordenação — familiar para desenvolvedores com experiência em Elasticsearch.Agregação: Agregações
terms, de métricas efilterpara análises sobre os resultados da busca. Consulte Aggregations.Autocompletar: Correspondência difusa baseada em prefixo para experiências de busca enquanto você digita.
Analisadores integrados e personalizados: Analisadores integrados para inglês (
standard,stop), chinês (jieba,IK) e outros idiomas. Também há suporte para analisadores personalizados com dicionários e stop words definidos pelo usuário. Para mais detalhes, consulte Search analyzers.Consulta em índices fragmentados: Pesquise em múltiplos índices de shard com
TFT.MSEARCHe obtenha resultados agregados.Compressão de documentos: Comprima documentos armazenados para reduzir o uso de memória. Desativado por padrão.
Cache de consultas: Armazene em cache resultados de consultas recentes para melhorar o desempenho em dados frequentes.
Pré-requisitos
A instância deve ser uma memory-optimized instance do Tair (baseada em DRAM) executando uma das seguintes versões:
|
Versão do mecanismo |
Versão secundária mínima |
|
Compatível com Redis 5.0 |
1.7.27 ou posterior |
|
Compatível com Redis 6.0 |
6.2.4.1 ou posterior |
|
Compatível com Redis 7.0 |
Todas as versões secundárias |
Atualize a instância para a versão secundária mais recente para obter o maior número de recursos e a melhor estabilidade. Para instruções, consulte Upgrade minor and proxy versions . Em instâncias cluster ou com divisão de leitura/escrita, atualize também os nós proxy para a versão secundária mais recente para garantir que todos os comandos funcionem conforme o esperado.
Notas de versão
Instâncias baseadas em DRAM compatíveis com Redis 5.0
|
Data |
Versão |
Alterações |
|
2022-03-11 |
V1.7.27 |
Lançamento do TairSearch |
|
2022-05-24 |
V1.8.5 |
Recurso de agregação |
|
2022-09-06 |
V5.0.15 |
Comando |
|
2023-01-13 |
V5.0.25 |
Analisadores |
|
2023-03-15 |
V5.0.28 |
Cache de consultas, compressão de documentos, comando |
|
2023-06-12 |
V5.0.35 |
Tipo de dado ARRAY, algoritmo de similaridade Okapi BM25 |
Instâncias baseadas em DRAM compatíveis com Redis 6.0
|
Data |
Versão |
Alterações |
|
2023-02-07 |
V6.2.4.1 |
TairSearch (todos os recursos da V5.0.25) |
|
2023-03-14 |
V6.2.5.0 |
Cache de consultas, compressão de documentos, |
|
2023-06-12 |
V6.2.7.3 |
Tipo de dado ARRAY, Okapi BM25 (todos os recursos da V5.0.35) |
|
2023-12-21 |
V23.12.1.2 |
Comando |
Instâncias baseadas em DRAM compatíveis com Redis 7.0
|
Data |
Versão |
Alterações |
|
2024-07-22 |
V24.7.0.0 |
Suporte ao TairSearch |
Melhores práticas
Observações de uso
Os dados do TairSearch são armazenados na instância Tair e consomem memória da instância.
-
Para reduzir o uso de memória:
Defina
indexcomotrueapenas para campos que precisam ser pesquisáveis. Definaindexcomofalsepara os demais campos.Utilize
_sourcecom padrõesincludes/excludespara armazenar somente os campos necessários do documento.Escolha um analisador adequado para evitar tokenização desnecessária e aumento no consumo de memória.
Ative a compressão de documentos grandes.
Mantenha o número de documentos por índice abaixo de 5 milhões. Isso evita distorção de dados em instâncias cluster, equilibra requisições de leitura e escrita e reduz chaves grandes e hotkeys. Divida grandes conjuntos de dados em múltiplos índices e use
TFT.MSEARCHpara consultá-los em conjunto.
Convenções de sintaxe
|
Convenção |
Significado |
|
|
|
Palavra-chave do comando |
|
|
itálico |
Variável |
|
|
|
Parâmetro opcional. Parâmetros sem colchetes são obrigatórios. |
|
|
`A\ |
B` |
Parâmetros mutuamente exclusivos. Especifique apenas um. |
|
|
O parâmetro anterior pode ser repetido. |
Comandos de busca full-text
TFT.CREATEINDEX
Crie um índice com uma definição de mapeamento. A sintaxe de mapeamento é semelhante ao mapeamento explícito do Elasticsearch. É necessário criar um índice antes de adicionar documentos.
Sintaxe
TFT.CREATEINDEX index mappings [settings]
Para evitar chaves grandes, divida índices extensos em índices menores commappingsesettingsidênticos e consulte-os em conjunto comTFT.MSEARCH.
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice a ser criado. |
|
mappings |
Sim |
Definição de mapeamento em JSON. Consulte Opções de mapeamento. |
|
settings |
Não |
Configurações JSON para o índice. Consulte Configurações do índice. |
Opções de mapeamento
O objeto mappings suporta os seguintes campos de nível superior:
dynamic
Modo de mapeamento. Valores válidos:
"strict"-- Dados só podem ser escritos em campos definidos emproperties. A escrita em campos não definidos falha.Não especificado (padrão) -- Modo não estrito. O sistema não verifica se os campos escritos estão definidos em
properties.
enabled
Controla a verificação de tipo para campos não indexados (index definido como false). Valores válidos: true (padrão) e false. Quando true, uma escrita falha se o tipo do campo não corresponder ao tipo definido em properties. Campos indexados sempre passam por verificação de tipo, independentemente desta configuração.
_source
Controla se o documento original é armazenado. Esta configuração não afeta a criação do índice.
enabled--true(padrão) armazena o documento original.falsenão o armazena.includes-- Um array de padrões de nomes de campos a incluir. Há suporte para curingas.excludes-- Um array de padrões de nomes de campos a excluir. Há suporte para curingas. Se um campo corresponder tanto aincludesquanto aexcludes,excludestem precedência (o campo não é armazenado).
Exemplos:
"_source": {"enabled": true}
Esta é a configuração padrão — armazena todos os campos. Equivalente a "_source": {"enabled": true, "excludes": [], "includes": []}.
"_source": {"enabled": true, "excludes": [], "includes": ["id", "name"]}
Armazena apenas os campos id e name.
properties
Coleção de definições de campos. Cada campo suporta os seguintes atributos:
|
Atributo |
Descrição |
Padrão |
|
|
Tipo de dado. Consulte Tipos de campo. |
Obrigatório |
|
|
Indica se este campo é indexado (pesquisável). |
|
|
|
Peso do campo para pontuação. Número de ponto flutuante positivo. |
|
|
|
Algoritmo de similaridade: |
|
Tipos de campo
|
Tipo |
Descrição |
Opções específicas do tipo |
|
|
String que não é tokenizada. Adequada para consultas de correspondência exata. |
|
|
|
String tokenizada por um analisador antes da indexação. |
|
|
|
Inteiro de 64 bits. Adequado para timestamps (Unix epoch). |
-- |
|
|
Inteiro de 32 bits. |
-- |
|
|
Número de ponto flutuante de 64 bits. |
-- |
Suporte a ARRAY: Todos os tipos de campo suportam variantes de array. Acrescente [] ao nome do tipo. Por exemplo, keyword[] declara um array de keywords.
TFT.CREATEINDEX idx:products '{"mappings":{"properties":{"tags":{"type":"keyword[]"}}}}'
Opções de analisador de texto
|
Opção |
Descrição |
Padrão |
|
|
Analisador usado para indexação. Consulte Built-in analyzers. Também é possível especificar analisadores personalizados, configurados pela seção |
|
|
|
Analisador usado no momento da busca. Mesmos valores válidos de |
Igual a |
Analisadores integrados
standard (padrão), jieba (recomendado para chinês, funciona melhor que chinese), stop, IK, pattern, whitespace, simple, keyword, chinese, french, dutch, russian.
Para mais detalhes, consulte Built-in analyzers.
Configurações do índice
O objeto opcional settings suporta os seguintes campos:
analysis
Define analisadores personalizados. Para mais detalhes, consulte Custom analyzers.
index
Configura algoritmos de similaridade personalizados. Use esta opção para personalizar os parâmetros do Okapi BM25:
|
Parâmetro |
Descrição |
Padrão |
Valores válidos |
|
|
Controla o quanto a frequência do termo afeta a pontuação. Valores maiores aumentam o efeito. |
|
Maior que |
|
|
Controla o quanto o comprimento do documento afeta a pontuação. Valores maiores aumentam o efeito. |
|
De |
Exemplo:
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
Configura o cache de resultados de consulta. Por padrão, o cache armazena até 10.000 resultados sem limite de memória. Quando cheio, os resultados são removidos usando o algoritmo Least Recently Used (LRU).
|
Parâmetro |
Tipo |
Descrição |
Padrão |
|
|
STRING |
Memória máxima para todos os caches de consulta. Suporta unidades |
Sem limite |
|
|
INTEGER |
Tempo de vida dos resultados em cache, em segundos. |
|
Exemplo:
"settings": {"queries_cache": {"size": "100mb", "ttl": 3}}
queries_cacheé um parâmetro de nível de nó. Configurá-lo em um índice afeta todos os outros índices no mesmo processo. Utilize a mesma configuração dequeries_cacheem todos os índices.
compress_doc
Configura a compressão transparente de documentos. Ativar a compressão aumenta o consumo de CPU e a latência de leitura/escrita. Ative esta opção apenas quando o índice for grande (quilobytes ou mais) e o custo de armazenamento for a principal preocupação.
|
Parâmetro |
Tipo |
Descrição |
Padrão |
|
|
STRING |
Limiar de compressão. Documentos são comprimidos apenas quando atingem este tamanho. Suporta unidades |
|
|
|
BOOLEAN |
Se deve ativar a compressão. |
|
Exemplo:
"settings": {"compress_doc": {"size": "1kb", "enable": true}}
A compressão aplica-se apenas a documentos escritos ou atualizados após você ativar a configuração com TFT.UPDATEINDEX . Documentos existentes não são comprimidos retroativamente.
Valor de retorno
Em caso de sucesso:
OKEm caso de falha: Uma mensagem de erro
Exemplo
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
Consulte também: TFT.UPDATEINDEX, TFT.GETINDEX
TFT.UPDATEINDEX
Adiciona novos campos ao mapeamento de um índice ou modifica suas configurações.
Sintaxe
TFT.UPDATEINDEX index mappings [settings]
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
mappings |
Sim |
Novos campos |
|
settings |
Não |
Configurações modificadas do índice. Apenas |
Para a sintaxe completa de mappings e settings, consulte TFT.CREATEINDEX.
Valor de retorno
Em caso de sucesso:
OKEm caso de falha: Uma mensagem de erro
Exemplo
TFT.UPDATEINDEX idx:product '{"mappings":{"properties":{"product_group":{"type":"text","analyzer":"chinese"}}}}'
OK
Consulte também: TFT.CREATEINDEX, TFT.GETINDEX
TFT.GETINDEX
Recupera o mapeamento e as configurações de um índice.
Sintaxe
TFT.GETINDEX index
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
Valor de retorno
Em caso de sucesso: O conteúdo de mapeamento do índice formatado em JSON
Em caso de falha: Uma mensagem de erro
Exemplo
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"}}}}}
Consulte também: TFT.CREATEINDEX, TFT.UPDATEINDEX
TFT.ADDDOC
Adiciona um único documento a um índice.
Sintaxe
TFT.ADDDOC index document [WITH_ID doc_id]
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
document |
Sim |
Documento JSON. Os valores dos campos devem corresponder aos tipos de dados definidos no mapeamento. |
|
|
Não |
ID personalizado do documento (string). Se omitido, um ID é gerado automaticamente. Se o ID especificado já existir, o documento existente será sobrescrito. |
Se_sourceestiver configurado comincludes, apenas os campos listados emincludesserão armazenados ao adicionar ou atualizar um documento.
Valor de retorno
Em caso de sucesso: Um objeto JSON contendo o ID do documento, por exemplo,
{"_id":"00001"}Em caso de falha: Uma mensagem de erro
Exemplos
Adicionar um documento com ID personalizado:
TFT.ADDDOC idx:product '{"product_id":"product test"}' WITH_ID 00001
{"_id":"00001"}
Adicionar um documento com um campo de array:
TFT.ADDDOC idx:product '{"product_id":["an","2","3df"]}' WITH_ID 00001
Consulte também: TFT.MADDDOC, TFT.UPDATEDOCFIELD, TFT.DELDOC
TFT.MADDDOC
Adiciona vários documentos a um índice em uma única operação atômica. Se qualquer documento tiver formato inválido, nenhum documento será adicionado.
Sintaxe
TFT.MADDDOC index document doc_id [document1 doc_id1] ...
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
document |
Sim |
Documento JSON. Os valores dos campos devem corresponder aos tipos de dados definidos no mapeamento. |
|
doc_id |
Sim |
ID do documento (string). |
Se_sourceestiver configurado comincludes, apenas os campos listados emincludesserão armazenados ao adicionar ou atualizar um documento.
Valor de retorno
Em caso de sucesso:
OKEm caso de falha: Uma mensagem de erro
Exemplo
TFT.MADDDOC idx:product '{"product_id":"test1"}' 00011 '{"product_id":"test2"}' 00012
OK
Consulte também: TFT.ADDDOC, TFT.DELDOC
TFT.UPDATEDOCFIELD
Atualize campos específicos em um documento. Se o documento não existir, ele será criado (equivalente a TFT.ADDDOC). Se um campo não existir, ele será adicionado.
Sintaxe
TFT.UPDATEDOCFIELD index doc_id document
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
doc_id |
Sim |
ID do documento a ser atualizado. |
|
document |
Sim |
Objeto JSON contendo os campos a serem atualizados. Campos indexados devem corresponder aos tipos de dados definidos no mapeamento. Campos não indexados podem ser de qualquer tipo. |
Se_sourceestiver configurado comincludes, apenas os campos listados emincludesserão armazenados ao adicionar ou atualizar um documento.
Valor de retorno
Em caso de sucesso:
OKEm caso de falha: Uma mensagem de erro
Exemplo
TFT.UPDATEDOCFIELD idx:product 00011 '{"product_id":"test8","product_group":"BOOK"}'
OK
Consulte também: TFT.ADDDOC, TFT.DELDOCFIELD
TFT.DELDOCFIELD
Exclua um ou mais campos de um documento. Se o campo for indexado, sua entrada no índice também será removida.
Sintaxe
TFT.DELDOCFIELD index doc_id field [field1 field2 ...]
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
doc_id |
Sim |
ID do documento. |
|
field |
Sim |
Um ou mais nomes de campos a excluir. |
A operação falha se o campo especificado não existir no documento (por exemplo, um campo filtrado por _source ).
Valor de retorno
Em caso de sucesso: O número de campos excluídos (inteiro)
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.DELDOCFIELD idx:product 00011 product_group
(integer) 1
Consulte também: TFT.UPDATEDOCFIELD
TFT.INCRLONGDOCFIELD
Incrementa um campo inteiro em um documento. O campo deve ser do tipo LONG ou INTEGER. O tipo de dado ARRAY não é suportado.
Sintaxe
TFT.INCRLONGDOCFIELD index doc_id field increment
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
doc_id |
Sim |
ID do documento. |
|
field |
Sim |
Campo a ser incrementado. Deve ser do tipo |
|
increment |
Sim |
Valor do incremento. Pode ser um inteiro positivo ou negativo. |
Se o documento não existir, ele será criado automaticamente com o campo inicializado em0antes de aplicar o incremento. A operação falha se o campo não existir no documento (por exemplo, um campo filtrado por_source).
Valor de retorno
Em caso de sucesso: O valor atualizado do campo (inteiro)
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.INCRLONGDOCFIELD idx:product 00011 stock 100
(integer)100
Consulte também: TFT.INCRFLOATDOCFIELD, TFT.UPDATEDOCFIELD
TFT.INCRFLOATDOCFIELD
Incrementa um campo de ponto flutuante em um documento. O campo deve ser do tipo DOUBLE. O tipo de dado ARRAY não é suportado.
Sintaxe
TFT.INCRFLOATDOCFIELD index doc_id field increment
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
doc_id |
Sim |
ID do documento. |
|
field |
Sim |
Campo a ser incrementado. Deve ser do tipo |
|
increment |
Sim |
Valor do incremento. Pode ser um número de ponto flutuante positivo ou negativo. |
Se o documento não existir, ele será criado automaticamente com o campo inicializado em0antes de aplicar o incremento. A operação falha se o campo não existir no documento (por exemplo, um campo filtrado por_source).
Valor de retorno
Em caso de sucesso: O valor atualizado do campo (string)
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.INCRFLOATDOCFIELD idx:product 00011 stock 299.6
"299.6"
Consulte também: TFT.INCRLONGDOCFIELD, TFT.UPDATEDOCFIELD
TFT.GETDOC
Recupera um documento pelo seu ID.
Sintaxe
TFT.GETDOC index doc_id
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
doc_id |
Sim |
ID do documento. |
Valor de retorno
Em caso de sucesso: Um objeto JSON com o ID e o conteúdo do documento
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.GETDOC idx:product 00011
{"_id":"00011","_source":{"product_id":"test8"}}
Consulte também: TFT.EXISTS, TFT.SEARCH
TFT.EXISTS
Verifica se um documento existe em um índice.
Sintaxe
TFT.EXISTS index doc_id
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
doc_id |
Sim |
ID do documento. |
Valor de retorno
1se o documento existir0se o índice ou documento não existirEm caso de falha: Uma mensagem de erro
Exemplo
TFT.EXISTS idx:product 00011
(integer) 1
Consulte também: TFT.GETDOC, TFT.DOCNUM
TFT.DOCNUM
Obtém o número de documentos em um índice.
Sintaxe
TFT.DOCNUM index
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
Valor de retorno
Em caso de sucesso: A contagem de documentos (inteiro)
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.DOCNUM idx:product
(integer) 3
Consulte também: TFT.EXISTS, TFT.SCANDOCID
TFT.SCANDOCID
Varre IDs de documentos em um índice usando um cursor, semelhante ao comando SCAN do Redis.
Sintaxe
TFT.SCANDOCID index cursor [MATCH *value*] [COUNT count]
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
cursor |
Sim |
Posição do cursor. Use |
|
|
Não |
Padrão estilo glob para filtrar IDs de documentos. Exemplo: |
|
|
Não |
Número máximo de itens a retornar por varredura. Padrão: |
Valor de retorno
Um array de dois elementos:
Cursor para a próxima iteração.
0indica que a varredura foi concluída.Array de IDs de documentos.
Exemplo
TFT.SCANDOCID idx:product 0 COUNT 3
1) "0"
2) 1) "00001"
2) "00011"
3) "00012"
Consulte também: TFT.DOCNUM, TFT.GETDOC
TFT.DELDOC
Exclua um ou mais documentos de um índice pelo ID do documento.
Sintaxe
TFT.DELDOC index doc_id [doc_id] ...
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
doc_id |
Sim |
Um ou mais IDs de documentos a excluir. |
Valor de retorno
Em caso de sucesso: O número de documentos realmente excluídos (string). IDs inexistentes são ignorados.
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.DELDOC idx:product 00011 00014
"1" # Document 00014 does not exist, so only document 00011 is deleted.
Consulte também: TFT.DELALL, TFT.ADDDOC
TFT.DELALL
Exclua todos os documentos de um índice, mantendo o índice e seu mapeamento.
Sintaxe
TFT.DELALL index
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
Valor de retorno
Em caso de sucesso:
OKEm caso de falha: Uma mensagem de erro
Exemplo
TFT.DELALL idx:product
OK
Consulte também: TFT.DELDOC, DEL
TFT.ANALYZER
Testa como um analisador tokeniza um determinado texto.
Sintaxe
TFT.ANALYZER analyzer_name text [INDEX index_name] [SHOW_TIME]
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
analyzer_name |
Sim |
Nome de um analisador integrado ou personalizado. |
|
text |
Sim |
Texto a ser tokenizado. Deve estar codificado em UTF-8. |
|
|
Condicional |
Índice que contém a definição do analisador. Obrigatório ao usar um analisador personalizado ou um analisador integrado com stop words ou dicionários modificados. |
|
|
Não |
Inclui a duração da tokenização na saída, em microssegundos. A primeira execução com um dicionário grande (por exemplo, Jieba, IK) pode levar vários segundos devido ao carregamento do dicionário. |
Valor de retorno
Em caso de sucesso: Um objeto JSON contendo detalhes dos tokens
Em caso de falha: Uma mensagem de erro
Exemplo
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 nativo)
Use o comando DEL nativo do Redis para excluir uma ou mais chaves (índices) do TairSearch.
DEL key [key ...]
Para mais detalhes, consulte a referência do comando DEL.
TFT.SEARCH
Busca documentos em um índice usando a Query DSL.
Sintaxe
TFT.SEARCH index query
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
query |
Sim |
Instrução Query DSL em JSON. Consulte as seções abaixo para a sintaxe completa. |
A sintaxe da consulta é semelhante à Query DSL do Elasticsearch.
Valor de retorno
Em caso de sucesso, um objeto JSON contendo os resultados da busca:
{
"hits": {
"hits": [
{"_id": "...", "_index": "...", "_score": 1.0, "_source": {...}}
],
"max_score": 1.0,
"total": {
"relation": "eq",
"value": 3
}
}
}
O campo total.relation indica como a contagem se relaciona com total.value:
"eq"-- A contagem é exata."gte"-- A contagem é pelo menos este valor (quandotrack_total_hitséfalse).
Exemplo
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}}}
Consulte também: TFT.MSEARCH, TFT.EXPLAINCOST, TFT.EXPLAINSCORE
Tipos de consulta
O campo query na Query DSL suporta os seguintes tipos de consulta.
Ordenação
Use o campo sort para controlar a ordem dos resultados. O tipo de dado ARRAY não é suportado para ordenação.
|
Valor |
Descrição |
|
|
Ordena por pontuação de relevância em ordem decrescente. |
|
|
Ordena por ID do documento em ordem crescente. |
|
field_name |
Ordena por um campo específico em ordem crescente. O campo deve ser indexado ( |
Para ordenação por múltiplos campos, use um array. Controle a direção da ordenação com order ("desc" ou "asc"):
{"sort": [{"price": {"order": "desc"}}, {"_doc": {"order": "desc"}}]}
Filtragem de source
Use o campo _source para controlar quais campos do documento aparecem nos resultados:
{"_source": {"includes": ["f0"]}}
Suporta tanto includes quanto excludes com padrões curinga.
Paginação
|
Parâmetro |
Tipo |
Descrição |
Padrão |
|
|
INTEGER |
Deslocamento baseado em zero do primeiro resultado a retornar. |
|
|
|
INTEGER |
Número máximo de resultados a retornar. Valores válidos: |
|
Usarfromesizejuntos fornece paginação. O desempenho da consulta diminui à medida quefromaumenta.
track_total_hits
Controla se deve contar todos os documentos correspondentes para consultas term, terms ou match (consultas compostas também são suportadas, mas a correspondência difusa dentro de match é desativada).
|
Valor |
Comportamento |
|
|
Retorna apenas os 100 principais documentos ordenados por pontuação. |
|
|
Conta todos os documentos correspondentes. |
Definir track_total_hits como true com um grande número de documentos correspondentes pode causar lentidão nas consultas. Use com cautela.
TFT.MSEARCH
Busca em múltiplos índices que compartilham mapeamentos e configurações idênticos, agrega e retorna os resultados combinados.
Sintaxe
TFT.MSEARCH index_count index [index1] ... query
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index_count |
Sim |
Número de índices a pesquisar. Valores válidos: |
|
index |
Sim |
Um ou mais nomes de índices. Todos os índices devem ter |
|
query |
Sim |
Instrução Query DSL em JSON. Suporta |
TFT.MSEARCHnão suporta o parâmetrofrom. Use paginação baseada em cursor (veja abaixo).
Paginação baseada em cursor
Use size, reply_with_keys_cursor e keys_cursor juntos para paginação:
|
Parâmetro |
Tipo |
Descrição |
Padrão |
|
|
INTEGER |
Número de resultados a retornar por página. |
|
|
|
BOOLEAN |
Incluir posições do cursor na resposta. |
|
|
|
OBJECT |
Posições do cursor da consulta anterior. Use |
|
Como funciona:
Primeira consulta: Defina
reply_with_keys_cursorcomotruee omitakeys_cursor(ou defina como0). O Tair recuperasizedocumentos de cada índice, depois reúne, pontua, ordena e agrega os resultados combinados, retornando os principaissizedocumentos. A resposta inclui posiçõeskeys_cursorpara cada índice.Próxima consulta: Passe o
keys_cursorretornado da resposta anterior. O Tair continua a recuperação a partir das posições do cursor em cada índice.
Comportamento de agregação
TFT.MSEARCH agrega conjuntos de resultados filhos de cada índice em vez de agregar o conjunto de dados combinado:
Taxa e ordenação: Pontua e ordena conjuntos de resultados filhos.
sum, max, min, avg, value_count: Agrega através dos conjuntos de resultados filhos.
sum_of_squares, variance, std_deviation: Calcula médias através dos conjuntos de resultados filhos.
Agregação Terms e agregação Filter: Agrega através dos conjuntos de resultados filhos separadamente.
Valor de retorno
Em caso de sucesso, um objeto JSON semelhante à saída de TFT.SEARCH, mais um campo aux_info:
{
"aux_info": {
"index_crc64": 15096806844241479487,
"keys_cursor": {"key0": 2, "key1": 5, "key2": 3},
"field_type": {"f0": "long"}
}
}
|
Campo |
Descrição |
|
|
Hash CRC-64 dos mapeamentos e configurações. Pode ser ignorado para requisições de negócios. |
|
|
Posições do cursor para a próxima consulta paginada. Incluído apenas quando |
|
|
Tipos de dados dos campos ordenados. Incluído apenas ao ordenar por um campo de índice. |
Exemplo
Configure três índices com o mesmo mapeamento:
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}'
Primeira página:
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}}}
Segunda página (passe o keys_cursor da resposta anterior):
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}}}
Consulte também: TFT.SEARCH
TFT.EXPLAINCOST
Recupera o detalhamento do tempo de execução de uma consulta.
Sintaxe
TFT.EXPLAINCOST index query
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
query |
Sim |
Instrução Query DSL (mesma sintaxe de |
Valor de retorno
Um objeto JSON com as seguintes seções:
|
Seção |
Descrição |
|
|
Tempo de execução da consulta em microssegundos ( |
|
|
Tempo de agregação em microssegundos. Omitido se nenhuma agregação for especificada. |
|
|
Tempo para coleta e ordenação de resultados em microssegundos, além do tipo de coletor: |
Exemplo
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
}
}
Consulte também: TFT.SEARCH, TFT.EXPLAINSCORE
TFT.EXPLAINSCORE
Recupera detalhamentos completos de pontuação para resultados de busca, mostrando como as pontuações dos documentos são calculadas.
Disponível apenas para instâncias baseadas em DRAM compatíveis com Redis 6.0 ou posterior.
Sintaxe
TFT.EXPLAINSCORE index query [doc_id] ...
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
query |
Sim |
Instrução Query DSL (mesma sintaxe de |
|
doc_id |
Não |
Um ou mais IDs de documentos. Quando especificado, apenas esses documentos são incluídos na saída. |
Valor de retorno
O mesmo conjunto de resultados de TFT.SEARCH, mais um objeto _explanation para cada documento contendo:
|
Campo |
Descrição |
|
|
Pontuação do documento. |
|
|
Fórmula usada para cálculo da pontuação. |
|
|
Campo do documento correspondente aos termos da consulta. |
|
|
Termo da consulta encontrado no documento. |
|
|
Peso de pontuação aplicado a esta cláusula de consulta. |
|
|
Metadados e o processo de pontuação passo a passo. |
Exemplo
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}
}
}
Consulte também: TFT.SEARCH, TFT.EXPLAINCOST
Comandos de autocompletar
TFT.ADDSUG
Adiciona uma ou mais entradas de texto de autocompletar com pesos associados.
Sintaxe
TFT.ADDSUG index text weight [text weight] ...
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
text |
Sim |
Entrada de texto de autocompletar. |
|
weight |
Sim |
Peso de pontuação (inteiro positivo). Pesos maiores classificam mais alto nos resultados. |
Valor de retorno
Em caso de sucesso: O número de entradas de texto adicionadas (inteiro)
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.ADDSUG idx:redis 'redis is a memory database' 3 'redis cluster' 10
(integer) 2
Consulte também: TFT.GETSUG, TFT.DELSUG, TFT.SUGNUM
TFT.DELSUG
Exclua uma ou mais entradas de texto de autocompletar de um índice.
Sintaxe
TFT.DELSUG index text [text] ...
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
text |
Sim |
Entrada de texto exata a excluir. Deve ser uma correspondência completa e exata. |
Valor de retorno
Em caso de sucesso: O número de entradas de texto excluídas (inteiro)
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.DELSUG idx:redis 'redis is a memory database' 'redis cluster'
(integer) 2
Consulte também: TFT.ADDSUG, TFT.SUGNUM
TFT.SUGNUM
Obtém o número de entradas de texto de autocompletar em um índice.
Sintaxe
TFT.SUGNUM index
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
Valor de retorno
Em caso de sucesso: A contagem de entradas (inteiro)
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.SUGNUM idx:redis
(integer) 3
Consulte também: TFT.ADDSUG, TFT.GETSUG
TFT.GETSUG
Recupera sugestões de autocompletar correspondentes a um prefixo. Os resultados são retornados em ordem decrescente de peso.
Sintaxe
TFT.GETSUG index prefix [MAX_COUNT count] [FUZZY]
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
|
prefix |
Sim |
Prefixo a corresponder. |
|
|
Não |
Número máximo de entradas a retornar. Valores válidos: |
|
|
Não |
Ativa correspondência difusa. |
Valor de retorno
Em caso de sucesso: Uma lista de entradas de texto de autocompletar correspondentes
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.GETSUG idx:redis res MAX_COUNT 2 FUZZY
1) "redis cluster"
2) "redis lock"
Consulte também: TFT.ADDSUG, TFT.GETALLSUGS
TFT.GETALLSUGS
Recupera todas as entradas de texto de autocompletar em um índice.
Sintaxe
TFT.GETALLSUGS index
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
index |
Sim |
Nome do índice. |
Valor de retorno
Em caso de sucesso: Uma lista de todas as entradas de texto de autocompletar
Em caso de falha: Uma mensagem de erro
Exemplo
TFT.GETALLSUGS idx:redis
1) "redis cluster"
2) "redis lock"
3) "redis is a memory database"
Consulte também: TFT.GETSUG, TFT.ADDSUG
Agregações
Adicione uma cláusula aggs (ou aggregations) a uma consulta TFT.SEARCH para realizar agregações no conjunto de resultados.
Uso básico
Especifique um nome de agregação personalizado, um tipo de agregação e um field para agregar:
TFT.SEARCH shares '{"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Sum":{"sum":{"field":"purchase_price"}}}}'
A resposta inclui tanto os resultados da busca de query quanto os resultados da agregação de 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}}}
Adicione "size": 0 à consulta para retornar apenas resultados de agregação sem documentos.
Agregação de métricas
Agregações de métricas realizam cálculos numéricos em campos numéricos (integer, double, etc.) e não suportam subagregações aninhadas.
|
Métrica |
Descrição |
Tipos de campo suportados |
|
|
Soma dos valores do campo |
Numérico |
|
|
Valor máximo |
Numérico |
|
|
Valor mínimo |
Numérico |
|
|
Valor médio |
Numérico |
|
|
Soma dos valores ao quadrado |
Numérico |
|
|
Variância estatística |
Numérico |
|
|
Desvio padrão |
Numérico |
|
|
Contagem de valores (sem deduplicação) |
Numérico, |
|
|
Todas as métricas acima em uma única resposta |
Numérico |
Apenasvalue_countsuporta camposkeyword. Todas as outras métricas exigem campos numéricos.
Saída: Um valor DOUBLE calculado a partir do campo especificado.
Agregação Terms
Conta valores deduplicados em um campo keyword. Suporta subagregações aninhadas.
|
Parâmetro |
Descrição |
Padrão |
|
|
Campo de agregação. Apenas campos |
Obrigatório |
|
|
Número de buckets a retornar. Valores válidos: |
|
|
|
Ordem de classificação. |
|
|
|
Contagem mínima de documentos para que um bucket seja incluído nos resultados. |
|
|
|
Padrão regex ou valor exato que as chaves do bucket devem corresponder. Para campos string, há suporte para correspondência regex. Para campos array, é necessária correspondência exata. |
-- |
|
|
Padrão regex ou valor exato que as chaves do bucket não devem corresponder. Se tanto |
-- |
Saída: Um objeto JSON com buckets. Cada bucket contém key (o valor do campo) e doc_count (a contagem de documentos):
{
"aggregations": {
"Per_Investor_Freq": {
"buckets": [
{"doc_count": 2, "key": "Jay"},
{"doc_count": 1, "key": "Mila"}
]
}
}
}
Exemplo:
{"aggs": {"Per_Investor_Freq": {"terms": {"field": "investor"}}}}
Agregação Filter
Filtra resultados de consulta com uma instrução de consulta e conta documentos correspondentes. Suporta subagregações aninhadas.
Saída: O número de documentos (doc_count) correspondentes à condição do filtro.
Exemplos de agregação
Os exemplos a seguir usam um conjunto de dados de negociação de ações.
Etapa 1: Criar o índice
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"}}}}'
Etapa 2: Adicionar documentos
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"}'
Etapa 3: Execute consultas
sum -- Valor total de compra para um investidor
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 -- Maior preço de compra para um investidor
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 -- Preço médio de compra para um investidor
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 -- Desvio padrão dos preços de compra
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 -- Todas as estatísticas de uma vez
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 -- Investidores com pelo menos duas transações
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}]}}}
Agregação Terms aninhada -- Contagem de transações por ação com preço médio
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}}]}}}
Agregação Filter aninhada -- Filtrar por investidor com estatísticas estendidas
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}}}}