Esmy é uma biblioteca para pesquisa de texto completo, escrita em Rust. É inspirado no Lucene, mas pretende ser mais flexível.
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 é um sistema de recuperação de informações e se inspira muito em Lucene. A ideia principal é ter um índice invertido, que permite consultar quais documentos contêm determinado termo. No entanto, muitas vezes são necessárias estruturas de dados adicionais para poder visualizar ou processar os dados, por exemplo, para criar histogramas de conjuntos de resultados ou para poder fazer pesquisas geográficas. Assim, o Esmy está estruturado para acomodar a adição de novas estruturas de dados.
Esmy, como por exemplo Lucene, está estruturado em torno de índices e segmentos. Um segmento é uma coleção de estruturas de dados em disco e um índice é um conjunto de segmentos. Os segmentos são imutáveis. Ao adicionar documentos ao Esmy, você adiciona alguns documentos que em algum momento são confirmados no disco, momento em que um segmento é criado. Com o tempo, isso significará muitos pequenos segmentos. Para evitar tantos segmentos pequenos, Esmy pode mesclar segmentos em segmentos maiores. As estruturas de dados dos segmentos no disco podem então ser usadas para fazer algo útil, por exemplo, pesquisar texto.
Além de não estar na JVM, existem algumas diferenças em relação ao Lucene.
Uma é que Lucene trata o índice invertido como o núcleo da Biblioteca. Embora seja um recurso importante do Esmy, é apenas um tipo de estrutura de dados útil. Em vez disso, Esmy tem um conceito de recurso de segmento . O índice invertido é um desses recursos de segmento. Os requisitos de um recurso de segmento são que você possa criar um a partir de um conjunto de documentos e que o recurso possa mesclar arquivos gravados em arquivos maiores.
As funcionalidades são identificadas por nomes e, como são desacopladas dos campos, é possível adicionar mais de um tipo de índice para um determinado campo. Isso significa que você, por exemplo, pode ter um documento indexado com diferentes analisadores sem precisar ter campos separados para eles, como faria no Lucene.
Outra é que Esmy tem uma visão mais opinativa (mas aberta) sobre o que é um documento. Lucene trata um documento como um conjunto de campos na entrada, mas não tem noção de documento durante a leitura. Isso faz com que, por exemplo, o Elasticsearch tenha uma estrutura JSON emulando isso, armazenando o JSON como um campo de string. Como Lucene não é Elasticsearch, Lucene não pode usar esse campo _source
, Lucene não pode usar esse campo. Em vez disso, Esmy tem uma noção de documento e uma estrutura de dados em disco. Isso significa que Esmy pode usar o documento.
Este repositório é licenciado sob a licença Apache, versão 2.0, com exceção dos dados no diretório de dados, que vem da Wikipedia e é usado apenas para fins de teste.