Esmy es una biblioteca para búsqueda de texto completo, escrita en Rust. Está inspirado en Lucene, pero pretende ser más flexible.
let schema = SegmentSchemaBuilder :: new ( )
. add_full_doc ( "full_doc_feature" ) //features have names
. add_string_index (
"text_string_index" ,
"text" ,
Box :: new ( UAX29Analyzer :: new ( ) ) ) //Unicode tokenization
. build ( ) ;
let index = IndexBuilder :: new ( ) . create ( "path/to/index" , schema ) . unwrap ( ) ;
let doc1 = Doc :: new ( ) . string_field ( "text" , "The quick brown fox jumps over the lazy dog" ) ;
index . add_doc ( doc1 ) . unwrap ( ) ;
let doc2 = Doc :: new ( ) . string_field ( "text" , "Foxes are generally smaller than some other members of the family Canidae" ) ;
index . add_doc ( doc2 ) . unwrap ( ) ;
index . commit ( ) . unwrap ( ) ;
let query = TextQuery :: new (
"text" , //field
"brown fox" , //value
Box :: new ( UAX29Analyzer :: new ( ) ) , //Search with the same analyzer as we indexed
) ;
let mut collector = CountCollector :: new ( ) ;
let reader = index . open_reader ( ) . unwrap ( ) ;
reader . search ( & query , & mut collector ) . unwrap ( ) ;
assert_eq ! ( 1 , collector.total_count ( ) ) ;
Esmy es un sistema de recuperación de información y se inspira en gran medida en Lucene. La idea principal es tener un índice invertido, que le permita buscar qué documentos contienen un determinado término. Sin embargo, a menudo se necesitan estructuras de datos adicionales para poder visualizar o procesar los datos, por ejemplo, para crear histogramas de conjuntos de resultados o poder realizar búsquedas geográficas. Por lo tanto, Esmy está estructurado para adaptarse a la adición de nuevas estructuras de datos.
Esmy, como por ejemplo Lucene, está estructurado en torno a índices y segmentos. Un segmento es una colección de estructuras de datos en disco y un índice es un conjunto de segmentos. Los segmentos son inmutables. Al agregar documentos a Esmy, agrega algunos documentos que en algún momento se envían al disco, momento en el cual se crea un segmento. Con el tiempo, esto significará muchos segmentos pequeños. Para evitar tener tantos segmentos pequeños, Esmy puede fusionar segmentos en segmentos más grandes. Las estructuras de datos de los segmentos en disco se pueden utilizar para hacer algo útil, por ejemplo, buscar texto.
Además de no estar en la JVM, existen algunas diferencias con respecto a Lucene.
Una es que Lucene trata el índice invertido como el núcleo de la biblioteca. Si bien es una característica importante de Esmy, es sólo un tipo de estructura de datos útil. Esmy, en cambio, tiene el concepto de característica de segmento . El índice invertido es una de esas características del segmento. Los requisitos de una función de segmento es que pueda crear uno a partir de un conjunto de documentos y que la función pueda fusionar archivos que escribió en archivos más grandes.
Las características se identifican por nombres y, dado que están desacopladas de los campos, puede agregar más de un tipo de índice para un campo en particular. Esto significa que usted, por ejemplo, puede tener un documento indexado con diferentes analizadores sin tener que tener campos separados para ellos, como lo haría en Lucene.
Otra es que Esmy tiene una visión más obstinada (pero abierta) de lo que es un documento. Lucene trata un documento como un conjunto de campos en la entrada, pero no tiene noción de documento cuando lo lee. Esto lleva, por ejemplo, a que Elasticsearch tenga una estructura JSON que emule esto, almacenando el JSON como un campo de cadena. Como Lucene no es Elasticsearch, Lucene no puede usar ese campo _source
, Lucene no puede usar ese campo. En cambio, Esmy tiene una noción de documento y una estructura de datos en disco. Esto significa que Esmy puede utilizar el documento.
Este repositorio está bajo la licencia Apache, versión 2.0, con la excepción de los datos en el directorio de datos, que proviene de Wikipedia y solo se utiliza con fines de prueba.