1 puntos por GN⁺ 2024-05-28 | 1 comentarios | Compartir por WhatsApp
  • Tantivy es una biblioteca rápida de motor de búsqueda de texto completo escrita en Rust; se parece más a un crate para construir motores de búsqueda que a un servidor de búsqueda completo listo para usar
  • Su diseño está fuertemente inspirado en Apache Lucene y, si buscas un servidor alternativo a Elasticsearch o Apache Solr, recomiendan revisar Quickwit, un motor de búsqueda distribuido construido sobre Tantivy
  • Sus funciones incluyen búsqueda de texto completo, puntuación BM25, consultas en lenguaje natural, búsqueda de frases, indexación incremental, indexación multihilo, directorio con mmap, compresión SIMD de enteros, búsqueda por facetas, campos JSON y Collector de agregaciones, entre otras
  • Funciona con Rust estable, soporta Linux, macOS y Windows, y afirma tener un tiempo de arranque de menos de 10 ms, por lo que resulta adecuado para herramientas de línea de comandos
  • La búsqueda distribuida queda fuera del alcance de Tantivy; para modificar documentos hay que eliminar el documento existente y volver a indexarlo, y los documentos nuevos solo se pueden buscar después de commit, recargar IndexReader y obtener un nuevo Searcher

Posicionamiento y diseño de Tantivy

  • Tantivy es una biblioteca rápida de motor de búsqueda de texto completo escrita en Rust
  • No es un servidor de búsqueda que se ejecuta directamente como Elasticsearch o Apache Solr, sino un crate que puede usarse para crear ese tipo de motores de búsqueda
  • En términos de diseño, está más cerca de Apache Lucene y se inspira fuertemente en su arquitectura
  • Si buscas una alternativa a Elasticsearch o Apache Solr, recomiendan revisar el motor de búsqueda distribuido Quickwit, construido sobre Tantivy

Rendimiento y benchmarks

  • Tantivy ofrece benchmarks desglosados por tipo de consulta y tipo de colección
  • Los resultados de benchmark pueden variar según la naturaleza de la consulta y la carga
  • Los detalles de los benchmarks pueden revisarse en el repositorio search-benchmark-game
  • Según el FAQ, en benchmarks de latencia de búsqueda Tantivy es, en promedio, aproximadamente 2 veces más rápido que Lucene

Funciones de búsqueda e indexación

  • Funciones de búsqueda

    • Búsqueda de texto completo
    • Puntuación BM25 como en Lucene
    • Soporte para consultas en lenguaje natural: (michael AND jackson) OR "king of pop"
    • Soporte para búsqueda de frases: "michael jackson"
    • Consultas por rango
    • Búsqueda por facetas
    • JSON Field
    • Aggregation Collector: histogram, range buckets, average, stats metrics
  • Funciones de indexación

    • Soporte para indexación incremental
    • Soporte para indexación multihilo
    • Afirman que indexar la Wikipedia en inglés toma menos de 3 minutos en una computadora de escritorio
    • Configuración de indexación mediante term frequency y position indexing opcionales
    • Soporte para LogMergePolicy with deletes
    • Proporciona la API Searcher Warmer
  • Almacenamiento y campos

    • Soporte para mmap directory
    • Soporte para fast fields single-valued y multivalued de u64, i64 y f64
    • Soporte para fast fields de &[u8]
    • Soporte para campos text, i64, u64, f64, dates, ip, bool y hierarchical facet
    • La compresión del almacén de documentos soporta LZ4, Zstd y None

Tokenizers y soporte de idiomas

Entorno de ejecución y cómo empezar

  • Tantivy funciona con Rust estable
  • Los sistemas operativos compatibles son Linux, macOS y Windows
  • Su tiempo de arranque es de menos de 10 ms, por lo que es adecuado para herramientas de línea de comandos
  • Materiales para comenzar
  • La compilación y las pruebas locales se realizan con los siguientes comandos
git clone https://github.com/quickwit-oss/tantivy.git
cd tantivy
cargo test

Funciones fuera de alcance y modelo de cambios de datos

  • La búsqueda distribuida queda fuera del alcance de Tantivy
  • Si necesitas búsqueda distribuida, recomiendan revisar Quickwit
  • Los datos de Tantivy son inmutables
  • Para modificar un documento, hay que eliminar el documento existente y volver a indexarlo
  • Los documentos que se están indexando pueden buscarse después de que se llame a commit en IndexWriter
  • El IndexReader existente debe recargarse para reflejar los cambios
  • Los cambios solo son visibles desde un Searcher obtenido nuevamente

Bindings y casos de uso

  • Bindings disponibles para usarlo desde otros lenguajes
    • Python: tantivy-py
    • Ruby: tantiny
    • También pueden encontrarse otros bindings en GitHub, aunque podrían estar menos mantenidos
  • Ejemplos de uso de Tantivy
    • seshat: base de datos/indexador de mensajes de Matrix
    • tantiny: pequeña búsqueda de texto completo para Ruby
    • lnx: motor de búsqueda adaptable y tolerante a errores tipográficos con API REST
    • Bichon: archivador de correo en Rust, ligero y de alto rendimiento, con WebUI
  • Entre las empresas que usan Tantivy figuran Etsy, ParadeDB, Nuclia, Humanfirst.ai y Element.io

1 comentarios

 
GN⁺ 2024-05-28
Opiniones de Hacker News
  • La gente que creó esta biblioteca es realmente impresionante. El año pasado reemplacé una vieja base de código en Python2 AppEngine que tenía abandonada desde hacía mucho y rehice https://progscrape.com [1] sobre esto; es una biblioteca excelente y tremendamente rápida.
    En una Raspberry Pi, indexa el total de 1 millón de historias en cuestión de segundos.
    Corro el servicio de búsqueda de texto completo en la Pi de mi casa y, aunque la carga pico no es grande, de unos pocos rps, la CPU casi nunca sube más que unos cuantos puntos porcentuales. Hice una prueba de carga de búsqueda en la Pi hasta alrededor de 100 rps y aguantó. Fue una biblioteca muy útil que pude integrar casi tal cual; el equipo respondió muy rápido a los reportes de bugs y había poquísimos bugs.
    Si quieren ver qué tan reactiva es la búsqueda en un dispositivo tan pequeño, hagan clic en la etiqueta de cualquier historia. Las consultas son prácticamente instantáneas, y están pegándole a hasta 10 años * 12 meses de shards de búsqueda: https://progscrape.com/?search=javascript
    Para un proyecto moderno, recomendaría mirar esto antes que Lucene. Si escala tan bien incluso en una ARM64 pequeña, es muy probable que en servidores más grandes la experiencia sea mucho mejor.
    [1] https://github.com/progscrape/progscrape

    • Es una biblioteca realmente buena. La estoy usando en una herramienta CLI de backup incremental de correo electrónico todavía en pleno desarrollo, orientada a proveedores de email que usan JMAP.
      Quería permitir que los usuarios pudieran buscar en sus backups, y como estoy usando Rust, Tantivy parecía encajar perfecto. Indexar un solo email es tan rápido que ni siquiera hizo falta moverlo a un hilo separado, y buscar entre miles de emails también parece no dar problemas.
      Si necesitan búsqueda en una aplicación Rust, vale la pena echarle un vistazo a Tantivy.
    • Pequeño reporte de bug: en https://progscrape.com/?search=grep aparece Error: PersistError(UnexpectedError("Storage fetch panicked"))
    • Hace unos días usé meilisearch para una prueba de concepto rápida, pero con este repositorio voy a tener que volver a revisar Tantivy.
      Básicamente, lo único que necesito es búsqueda de texto completo.
  • Hace poco descubrí Tantivy dentro de ParadeDB. ParadeDB es una extensión de Postgres que busca reemplazar a Elastic.
    https://github.com/paradedb/paradedb/blob/dev/pg_search/Carg...
    Me enteré escuchando “Extending Postgres for High Performance Analytics (with Philippe Noël)”.
    https://www.youtube.com/watch?v=NbOAEJrsbaM
    Y también está en el proyecto principal, Quickwit. Es un proyecto que maneja logs, trazas y próximamente métricas.
    https://github.com/quickwit-oss/quickwit
    Probé Quickwit junto con ClickHouse en un proyecto personal de búsqueda multilingüe y fue sorprendentemente bueno. Por fin aparece una combinación útil para chino, japonés y coreano.
    https://quickwit.io/docs/guides/add-full-text-search-to-your...
    to_tsvector de PostgreSQL nunca terminó de ajustarse bien a mi caso de uso.
    SELECT * FROM dump WHERE to_tsvector('english'::regconfig, hh_fullname) @@ to_tsquery('english'::regconfig, 'query');
    Ojalá le vaya bien. Creo que voy a upvotear automáticamente cualquier post que tenga Tantivy como palabra clave.

    • La combinación de manejar indexación y consultas de búsqueda basadas en URL/REST completamente dentro de SQL es un patrón de diseño interesante. También se puede hacer lo mismo con un FDW de Postgres.
  • Hace poco desplegué en producción Quickwit, que está basado en Tantivy y hecho por el mismo equipo, e indexé decenas de miles de millones de objetos; estoy muy satisfecho. La velocidad de indexación es excelente y la latencia de las consultas también es competitiva.
    Lo más importante es que la separación de cómputo y almacenamiento nos dio un valor enorme. Pudimos levantar un nuevo servicio de búsqueda sobre decenas de miles de millones de objetos en object storage, e incluso hacer agregaciones complejas, sin pagar por servidores de alto rendimiento corriendo durante mucho tiempo; eso habilitó nuevos casos de uso que de otro modo habrían sido bastante caros.
    Cuando el caso de uso llega a justificar servidores de alto rendimiento, Quickwit también ofrece la opción de cachear los datos en cada servidor para mejorar el rendimiento.
    Como gran bonus, el equipo ayuda en Discord de forma muy rápida y amable.

  • Otro recurso es el índice de búsqueda por trigramas basado en Go que usa etsy/hound[0]. Está basado en el artículo y el código de Russ Cox “Regular Expression Matching with a Trigram Index”[1].
    [0] https://github.com/hound-search/hound
    [1] http://swtch.com/~rsc/regexp/regexp4.html
    Según la necesidad, las alternativas a Lucene también varían por caso de uso.

  • Un punto a tener en cuenta es que todavía no se puede agregar/eliminar campos: https://github.com/quickwit-oss/tantivy/issues/470
    La única forma de agregar campos es volver a indexar todos los datos en otro índice de búsqueda.

  • Descubrí Tantivy mientras buscaba una alternativa a Meilisearch, que envía datos de telemetría por defecto. Más que un motor de búsqueda en sí, se parece a un constructor de motores de búsqueda, pero la configuración parece bastante simple [0]
    [0]: https://github.com/quickwit-oss/tantivy-cli

    • QuickWit también envía telemetría por defecto: https://quickwit.io/docs/telemetry
    • Me interesa, pero me gustaría usarlo como biblioteca de Rust y manejar solo tipos de Rust, en lugar de configuración JSON.
      El SDK de Java de Meilisearch también era bueno. No requería CLI ni configuración manual, y bastaba con apuntar a las entidades de la base de datos para indexar toda la tabla.
      Sería bueno que Tantivy también tuviera una forma de trabajar así.
    • Se puede desactivar fácilmente agregando un solo argumento de línea de comandos, así que rechazarlo por eso, teniendo una búsqueda interactiva útil, parece una objeción menor.
  • Tantivy también se usa para ofrecer búsqueda de texto completo en un producto interesante de base de datos vectorial llamado LanceDb: https://lancedb.github.io/lancedb/fts/
    La última vez que lo revisé, solo era posible mediante bindings de Python, pero entiendo que están intentando implementar bindings de Rust nativos para soportar otras plataformas.

  • Hace unos años empecé un proyecto personal por la frustración absurda que me causaba que Elasticsearch fuera un monstruo devorador de recursos. Incluso mi computadora personal tenía más recursos que los que varias startups bien financiadas asignan a sus productos, y aun así pasaba eso.
    Elegí Tantivy por dos motivos. Uno era que quería hacerlo todo en Rust, y el otro era Tantivy en sí. Su rendimiento es 10/10, la documentación es de primer nivel y la experiencia de usar la biblioteca es muy buena.
    Lamentablemente, el alcance del proyecto era demasiado grande para manejarlo solo en mi tiempo libre, así que lo abandoné, pero aun así Tantivy es realmente excelente.

  • Estuve siguiendo Tantivy durante un tiempo. Me impresionan la perseverancia de sus fundadores y el rendimiento que Tantivy ha logrado recientemente.
    Un gran aplauso para todo el equipo. Creo firmemente que van a alcanzar sus objetivos.

  • Como alguien que ha usado mucho Lucene y Solr, lo que más deseo es soporte para upgrades. Normalmente, los índices de Lucene, Solr y ES no se pueden actualizar a una versión nueva. En algunos casos sí es posible, pero lo voy a dejar fuera por practicidad.
    En proyectos grandes, reindexar es muy caro y a veces casi imposible.
    También hay casos en los que es muy probable que sea absolutamente imposible. Por ejemplo, cuando cambia el algoritmo de indexación de un tipo de dato en un campo de índice con pérdida. Pero en muchos casos toda la información sigue estando ahí, así que sería realmente bueno poder identificar esos índices y actualizarlos.