Esmy adalah perpustakaan untuk pencarian teks lengkap, ditulis dalam Rust. Ini terinspirasi oleh Lucene, namun bertujuan untuk lebih fleksibel.
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 adalah sistem pencarian informasi, dan mengambil banyak inspirasi dari Lucene. Ide utamanya adalah memiliki indeks terbalik, yang memungkinkan Anda mencari dokumen mana yang mengandung istilah tertentu. Namun, sering kali struktur data tambahan diperlukan agar dapat memvisualisasikan atau memproses data, misalnya untuk membuat histogram kumpulan hasil atau untuk dapat melakukan penelusuran geografis. Dengan demikian, Esmy disusun untuk mengakomodasi penambahan struktur data baru.
Esmy, seperti misalnya Lucene, disusun berdasarkan indeks dan segmen. Segmen adalah kumpulan struktur data pada disk, dan indeks adalah sekumpulan segmen. Segmen tidak dapat diubah. Saat menambahkan dokumen ke Esmy, Anda menambahkan beberapa dokumen yang pada titik tertentu dikomit ke disk, pada titik mana segmen dibuat. Seiring waktu, hal ini akan berarti banyak segmen kecil. Untuk mencegah banyaknya segmen kecil, Esmy dapat menggabungkan segmen menjadi segmen yang lebih besar. Struktur data segmen pada disk kemudian dapat digunakan untuk melakukan sesuatu yang berguna, misalnya mencari teks.
Selain tidak ada di JVM, ada sedikit perbedaan dari Lucene.
Salah satunya adalah Lucene memperlakukan indeks terbalik sebagai inti Perpustakaan. Meskipun ini merupakan fitur penting Esmy, ini hanyalah salah satu jenis struktur data yang berguna. Esmy malah punya konsep fitur segmen . Indeks terbalik adalah salah satu fitur segmen tersebut. Persyaratan pada fitur segmen adalah Anda dapat membuatnya dari sekumpulan dokumen, dan fitur tersebut dapat menggabungkan file yang ditulisnya ke dalam file yang lebih besar.
Fitur diidentifikasi berdasarkan nama, dan karena fitur tersebut dipisahkan dari bidang, Anda dapat menambahkan lebih dari satu jenis indeks untuk bidang tertentu. Artinya, Anda, misalnya, dapat membuat dokumen diindeks dengan penganalisis berbeda tanpa harus memiliki kolom terpisah untuk penganalisis tersebut, seperti yang Anda lakukan di Lucene.
Alasan lainnya adalah Esmy mempunyai pandangan yang lebih berpendirian (namun terbuka) mengenai apa itu dokumen. Lucene memperlakukan dokumen sebagai sekumpulan kolom pada input, namun tidak memiliki gagasan tentang dokumen saat membaca. Hal ini menyebabkan Elasticsearch memiliki struktur JSON yang meniru ini, dengan menyimpan JSON sebagai bidang string. Karena Lucene bukan Elasticsearch, Lucene tidak dapat menggunakan bidang _source
tersebut, Lucene tidak dapat menggunakan bidang tersebut. Esmy malah memiliki gagasan tentang dokumen, dan struktur data pada disk. Artinya Esmy bisa menggunakan dokumen tersebut.
Repositori ini dilisensikan di bawah Lisensi Apache, lisensi Versi 2.0, dengan pengecualian data pada direktori data, yang berasal dari Wikipedia dan hanya digunakan untuk tujuan pengujian.