Esmy est une bibliothèque de recherche en texte intégral, écrite en Rust. Il s'inspire de Lucene, mais se veut plus 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 est un système de recherche d'informations et s'inspire beaucoup de Lucene. L'idée principale est d'avoir un index inversé, qui vous permet de rechercher quels documents contiennent un certain terme. Cependant, des structures de données supplémentaires sont souvent nécessaires pour pouvoir visualiser ou traiter les données, par exemple pour créer des histogrammes d'ensembles de résultats ou pour pouvoir effectuer une géorecherche. Ainsi, Esmy est structuré pour s'adapter à l'ajout de nouvelles structures de données.
Esmy, comme par exemple Lucene, est structuré autour d'indices et de segments. Un segment est un ensemble de structures de données sur disque et un index est un ensemble de segments. Les segments sont immuables. Lorsque vous ajoutez des documents à Esmy, vous ajoutez des documents qui sont à un moment donné enregistrés sur le disque, auquel cas un segment est créé. Au fil du temps, cela signifiera de nombreux petits segments. Afin d'éviter d'avoir autant de petits segments, Esmy peut fusionner des segments en segments plus grands. Les structures de données des segments sur le disque peuvent ensuite être utilisées pour effectuer quelque chose d'utile, par exemple rechercher du texte.
En plus de ne pas être sur la JVM, il existe quelques différences par rapport à Lucene.
La première est que Lucene traite l'index inversé comme le cœur de la bibliothèque. Bien qu'il s'agisse d'une fonctionnalité importante d'Esmy, ce n'est qu'un type de structure de données utile. Esmy a plutôt un concept de fonctionnalité de segment . L'index inversé est l'une de ces caractéristiques de segment. Les exigences relatives à une fonctionnalité de segment sont que vous pouvez en créer une à partir d'un ensemble de documents et que la fonctionnalité peut fusionner les fichiers qu'elle a écrits dans des fichiers plus volumineux.
Les fonctionnalités sont identifiées par des noms et, comme elles sont découplées des champs, vous pouvez ajouter plusieurs types d'index pour un champ particulier. Cela signifie que vous pouvez, par exemple, avoir un document indexé avec différents analyseurs sans avoir à avoir des champs séparés pour eux, comme vous le feriez dans Lucene.
Une autre raison est qu'Esmy a une vision plus opiniâtre (mais ouverte) de ce qu'est un document. Lucene traite un document comme un ensemble de champs en saisie, mais n'a aucune notion de document à la lecture. Cela conduit par exemple Elasticsearch à avoir une structure JSON qui émule cela, en stockant le JSON sous forme de champ de chaîne. Puisque Lucene n'est pas Elasticsearch, Lucene ne peut pas utiliser ce champ _source
, Lucene ne peut pas utiliser ce champ. Esmy a plutôt une notion de document et une structure de données sur disque. Cela signifie qu'Esmy peut utiliser le document.
Ce référentiel est sous licence Apache, version 2.0, à l'exception des données du répertoire de données, qui proviennent de Wikipédia et sont utilisées uniquement à des fins de test.