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 2.0 版許可證獲得許可,資料目錄中的資料除外,該資料來自維基百科,僅用於測試目的。