Esmy ist eine in Rust geschriebene Bibliothek für die Volltextsuche. Es ist von Lucene inspiriert, soll aber flexibler sein.
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 ist ein Informationsabrufsystem und lässt sich stark von Lucene inspirieren. Die Grundidee besteht darin, einen invertierten Index zu verwenden, der es Ihnen ermöglicht, nachzuschlagen, welche Dokumente einen bestimmten Begriff enthalten. Allerdings werden häufig zusätzliche Datenstrukturen benötigt, um die Daten visualisieren oder verarbeiten zu können, z. B. um Histogramme von Ergebnismengen zu erstellen oder eine Geosuche durchführen zu können. Daher ist Esmy so strukturiert, dass es das Hinzufügen neuer Datenstrukturen ermöglicht.
Esmy ist wie Lucene nach Indizes und Segmenten strukturiert. Ein Segment ist eine Sammlung von Datenstrukturen auf der Festplatte, und ein Index ist eine Reihe von Segmenten. Segmente sind unveränderlich. Wenn Sie Dokumente zu Esmy hinzufügen, fügen Sie einige Dokumente hinzu, die irgendwann auf der Festplatte gespeichert werden , woraufhin ein Segment erstellt wird. Mit der Zeit wird es viele kleine Segmente geben. Um zu verhindern, dass so viele kleine Segmente entstehen, kann Esmy Segmente zu größeren Segmenten zusammenführen. Die Datenstrukturen der Segmente auf der Festplatte können dann für nützliche Zwecke verwendet werden, z. B. für die Suche nach Text.
Abgesehen davon, dass es nicht auf der JVM ist, gibt es einige Unterschiede zu Lucene.
Einer davon ist, dass Lucene den invertierten Index als Kern der Bibliothek betrachtet. Obwohl es sich um eine wichtige Funktion von Esmy handelt, handelt es sich dabei nur um eine Art nützlicher Datenstruktur. Esmy hat stattdessen das Konzept einer Segmentfunktion . Der invertierte Index ist ein solches Segmentmerkmal. Die Anforderungen an ein Segmentfeature bestehen darin, dass Sie eines aus einer Reihe von Dokumenten erstellen können und dass das Feature die von ihm geschriebenen Dateien zu größeren Dateien zusammenführen kann.
Features werden durch Namen identifiziert, und da sie von Feldern entkoppelt sind, können Sie mehr als einen Indextyp für ein bestimmtes Feld hinzufügen. Dies bedeutet, dass Sie beispielsweise ein Dokument mit verschiedenen Analysetools indizieren lassen können, ohne dafür separate Felder haben zu müssen, wie dies in Lucene der Fall wäre.
Ein weiterer Grund ist, dass Esmy eine eigenwilligere (aber offenere) Sicht darauf hat, was ein Dokument ist. Lucene behandelt ein Dokument bei der Eingabe als eine Reihe von Feldern, hat beim Lesen jedoch keine Vorstellung von einem Dokument. Dies führt beispielsweise dazu, dass Elasticsearch eine JSON-Struktur hat, die dies emuliert, indem das JSON als String-Feld gespeichert wird. Da Lucene nicht Elasticsearch ist, kann Lucene dieses _source
Feld nicht verwenden, Lucene kann dieses Feld nicht verwenden. Esmy hat stattdessen eine Vorstellung von einem Dokument und einer Datenstruktur auf der Festplatte. Dies bedeutet, dass Esmy das Dokument verwenden kann.
Dieses Repository ist unter der Apache-Lizenz, Version 2.0, lizenziert, mit Ausnahme der Daten im Datenverzeichnis, die von Wikipedia stammen und nur zu Testzwecken verwendet werden.