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 рассматривает инвертированный индекс как ядро библиотеки. Хотя это важная особенность Esmy, это всего лишь один из видов полезной структуры данных. Вместо этого у Эсми есть концепция функции сегмента . Инвертированный индекс — одна из таких особенностей сегмента. Требования к функции сегмента заключаются в том, что вы можете создать его из набора документов и чтобы эта функция могла объединять записанные ею файлы в более крупные файлы.
Объекты идентифицируются по именам, и, поскольку они не связаны с полями, вы можете добавить более одного типа индекса для определенного поля. Это означает, что вы, например, можете проиндексировать документ с помощью разных анализаторов без необходимости иметь для них отдельные поля, как в Lucene.
Во-вторых, у Эсми более самоуверенное (но открытое) представление о том, что такое документ. Lucene рассматривает документ как набор полей при вводе, но не имеет понятия о документе при чтении. Это приводит, например, к тому, что Elasticsearch имеет JSON-структуру, имитирующую это, сохраняя JSON как строковое поле. Поскольку Lucene не является Elasticsearch, Lucene не может использовать это поле _source
, Lucene не может использовать это поле. Вместо этого у Эсми есть понятие документа и структуры данных на диске. Это означает, что Эсми может использовать документ.
Этот репозиторий лицензируется по лицензии Apache версии 2.0, за исключением данных в каталоге данных, которые взяты из Википедии и используются только в целях тестирования.