Esmy 是一个用于全文搜索的库,用 Rust 编写。它受到 Lucene 的启发,但旨在更加灵活。
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 是一个信息检索系统,从 Lucene 中汲取了很多灵感。主要思想是建立一个倒排索引,它允许您查找哪些文档包含某个术语。然而,通常需要额外的数据结构,以便能够可视化或处理数据,例如创建结果集的直方图或能够进行地理搜索。因此,Esmy 的结构可以容纳添加新的数据结构。
Esmy,例如 Lucene,是围绕索引和段构建的。段是磁盘上数据结构的集合,索引是一组段。段是不可变的。将文档添加到 Esmy 时,您会添加一些文档,这些文档在某个时刻会提交到磁盘,此时会创建一个段。随着时间的推移,这将意味着许多小的细分市场。为了防止有这么多小段,Esmy 可以将段合并为更大的段。然后,可以使用段的磁盘数据结构来做一些有用的事情,例如搜索文本。
除了不在 JVM 上之外,与 Lucene 也有一些不同。
一是Lucene把倒排索引作为Library的核心。虽然它是 Esmy 的一个重要特性,但它只是一种有用的数据结构。相反,Esmy 有一个分段特征的概念。倒排索引就是这样的段特征之一。对分段功能的要求是您可以从一组文档创建一个分段功能,并且该功能可以将其写入的文件合并为更大的文件。
功能通过名称进行标识,并且由于它们与字段分离,因此您可以为特定字段添加多种类型的索引。例如,这意味着您可以使用不同的分析器对文档进行索引,而不必像在 Lucene 中那样为它们设置单独的字段。
另一个问题是,Esmy 对于文档的含义有更加固执己见(但开放)的看法。 Lucene 在输入时将文档视为一组字段,但在读取时没有文档的概念。这导致 Elasticsearch 具有 JSON 结构,通过将 JSON 存储为字符串字段来模拟这一点。由于Lucene不是Elasticsearch,Lucene不能使用那个_source
字段,Lucene不能使用那个字段。相反,Esmy 有文档的概念和磁盘上的数据结构。这意味着 Esmy 可以使用该文档。
该存储库根据 Apache License, Version 2.0 许可证获得许可,数据目录中的数据除外,该数据来自维基百科,仅用于测试目的。