Esmy هي مكتبة للبحث عن النص الكامل المكتوب بلغة Rust. إنه مستوحى من لوسين، لكنه يهدف إلى أن يكون أكثر مرونة.
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.
الأول هو أن لوسين يتعامل مع الفهرس المقلوب باعتباره جوهر المكتبة. على الرغم من أنها ميزة مهمة في Esmy، إلا أنها تمثل نوعًا واحدًا فقط من بنية البيانات المفيدة. لدى Esmy بدلاً من ذلك مفهوم ميزة المقطع . يعد الفهرس المقلوب أحد هذه الميزات. المتطلبات الخاصة بميزة المقطع هي أنه يمكنك إنشاء واحدة من مجموعة من المستندات، وأن الميزة يمكنها دمج الملفات التي كتبتها في ملفات أكبر.
يتم تعريف الميزات بالأسماء، وبما أنها منفصلة عن الحقول، يمكنك إضافة أكثر من نوع واحد من الفهرس لحقل معين. هذا يعني أنه، على سبيل المثال، يمكنك الحصول على مستند مفهرس باستخدام محللين مختلفين دون الحاجة إلى وجود حقول منفصلة لهم، كما تفعل في Lucene.
سبب آخر هو أن Esmy لديه وجهة نظر أكثر رأيًا (ولكنها منفتحة) حول ماهية المستند. يتعامل لوسين مع المستند كمجموعة من الحقول عند الإدخال، لكن ليس لديه فكرة عن المستند عند القراءة. يؤدي هذا على سبيل المثال إلى أن Elasticsearch يحتوي على بنية JSON تحاكي ذلك، عن طريق تخزين JSON كحقل سلسلة. نظرًا لأن Lucene ليس Elasticsearch، فلا يمكن لـ Lucene استخدام حقل _source
هذا، ولا يمكن لـ Lucene استخدام هذا الحقل. لدى Esmy بدلاً من ذلك فكرة عن المستند وبنية البيانات الموجودة على القرص. وهذا يعني أن Esmy يمكنه استخدام المستند.
تم ترخيص هذا المستودع بموجب ترخيص Apache، الإصدار 2.0، باستثناء البيانات الموجودة في دليل البيانات، والتي تأتي من Wikipedia وتستخدم فقط لأغراض الاختبار.