1 pontos por GN⁺ 2024-05-28 | 1 comentários | Compartilhar no WhatsApp

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

 
GN⁺ 2024-05-28
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: o to_tsvector do 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.