Biblioteca rápida de mecanismo de busca full-text escrita em Rust
Introdução
- Tantivy é uma biblioteca de mecanismo de busca fortemente inspirada no design do Apache Lucene.
- Também existe um mecanismo de busca distribuída chamado Quickwit, que pode ser usado como alternativa ao Elasticsearch ou ao Apache Solr.
- Tantivy não é um servidor de busca, mas sim um crate para construir mecanismos de busca.
Benchmark
- Fornece benchmarks de desempenho para vários tipos de consultas e coleções.
- O desempenho pode variar de acordo com a natureza da consulta e a carga.
Principais recursos
- Busca full-text: suporte a tokenizers para vários idiomas.
- Desempenho rápido: tempo de inicialização rápido e suporte a indexação multithread.
- Scoring BM25: mesmo método de pontuação do Lucene.
- Consultas em linguagem natural: consegue processar naturalmente até consultas complexas.
- Consultas por intervalo e campos de facetas hierárquicas: suporte a vários tipos de dados.
- Armazenamento de documentos comprimido: suporte a vários métodos de compressão, como LZ4 e Zstd.
- Campos JSON e coletores de agregação: suporte a histogramas, buckets de intervalo, média e métricas estatísticas.
O que não faz
- Busca distribuída está fora do escopo do Tantivy. Se precisar de busca distribuída, consulte o Quickwit.
Primeiros passos
- Tantivy funciona em Rust estável e oferece suporte a Linux, macOS e Windows.
- tantivy-cli: fornece uma interface de linha de comando para criar facilmente um mecanismo de busca, além de indexar e pesquisar.
- Documentação de referência: fornece documentação de referência para a versão de release mais recente.
Como apoiar o projeto
- Use o Tantivy e compartilhe sua experiência.
- Envie relatórios de bugs.
- Escreva posts de blog.
- Ajude com a documentação.
- Contribua com código.
Contribuição de código
- Usa o fluxo de trabalho de Pull Request do GitHub.
- Ao contribuir, faça referência ao ticket do GitHub e escreva mensagens de commit abrangentes.
FAQ
- Suporte a outras linguagens: oferece bindings para várias linguagens, como Python e Ruby.
- Exemplos de uso: usado em vários projetos, como seshat, tantiny e lnx.
- Comparação de velocidade: cerca de 2 vezes mais rápido que o Lucene.
- Suporte a indexação incremental: sim.
- Edição de documentos: os documentos são imutáveis. É necessário excluir e reindexar.
- Quando a busca fica disponível durante a indexação: pesquisável após chamar
commit.
Opinião do GN⁺
- Desempenho rápido baseado em Rust: um mecanismo de busca rápido que aproveita o desempenho e a segurança do Rust, adequado para projetos em que performance é importante.
- Suporte a vários idiomas: pode ser usado em diferentes ambientes por meio de bindings para linguagens como Python e Ruby.
- Indexação incremental: um recurso útil ao lidar com grandes volumes de dados.
- Imutabilidade dos documentos: mantém a consistência dos dados, mas exige reindexação ao modificar documentos.
- Integração com o Quickwit: se precisar de busca distribuída, vale a pena usar junto com o Quickwit.
1 comentários
Comentários do Hacker News
Compartilhando experiência de projeto: usei esta biblioteca para reconstruir o <a href="https://progscrape.com" rel="nofollow">progscrape.com</a> a fim de substituir uma base de código antiga em Python2 no AppEngine. A biblioteca é muito rápida e conseguiu indexar 1M de histórias em um Raspberry Pi em poucos segundos. O uso de CPU era muito baixo, e o desempenho de busca também foi excelente.
ParadeDB e Tantivy: recentemente descobri o Tantivy no ParadeDB (extensão do Postgres). Ele é usado para expandir o Postgres para análises de alto desempenho.
Quickwit e Clickhouse: em um projeto de busca multilíngue, o desempenho combinado de Quickwit e Clickhouse foi muito bom. Foi especialmente útil para buscas em chinês, japonês e coreano.
Limitações do
to_tsvector: oto_tsvectordo PostgreSQL não se encaixou bem em certos casos de uso. Torço pelo sucesso do Tantivy.Implantação do Quickwit em produção: usei o Quickwit para indexar dezenas de bilhões de objetos, e a velocidade de indexação e a latência de consulta são competitivas. A separação entre computação e armazenamento foi muito útil.
Desempenho do Tantivy: fiquei impressionado com o desempenho do Tantivy e com o esforço dos fundadores. Tenho confiança no sucesso da equipe.
Busca por trigramas no Etsy/Hound: já tive experiência usando um índice de busca por trigramas em Go, baseado no casamento de expressões regulares de Russ Cox.
Motivos para escolher Tantivy: escolhi o Tantivy após me decepcionar com o consumo de recursos do Elasticsearch. Eu queria tocar o projeto em Rust, e o desempenho e a documentação do Tantivy eram excelentes.
Problemas de atualização no Lucene e Solr: o suporte a atualização de índices no Lucene e no Solr é fraco. Em muitos projetos grandes, reindexar é muito caro e às vezes impossível.
Limitações para adicionar/remover campos: no Tantivy, não é possível adicionar ou remover campos, e é preciso reindexar todos os dados em outro índice de busca.
Alternativa ao Meilisearch: procurei o Tantivy como alternativa por causa de problemas de telemetria no Meilisearch. A configuração parece simples.
LanceDb e Tantivy: o produto de banco de dados vetorial LanceDb usa o Tantivy para oferecer busca de texto completo. No momento isso só é possível por meio de bindings em Python, mas eles pretendem implementar bindings em Rust.