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 とはいくつかの違いがあります。
1 つは、Lucene が転置インデックスをライブラリのコアとして扱うことです。これは Esmy の重要な機能ですが、有用なデータ構造の 1 種類にすぎません。 Esmy には、代わりにセグメント機能という概念があります。転置インデックスは、そのようなセグメント機能の 1 つです。セグメント機能の要件は、一連のドキュメントからセグメント機能を作成できること、およびその機能が書き込んだファイルをより大きなファイルにマージできることです。
フィーチャは名前によって識別され、フィーチャはフィールドから切り離されているため、特定のフィールドに複数の種類のインデックスを追加できます。これは、たとえば、Lucene の場合のように、別のフィールドを用意することなく、さまざまなアナライザーでドキュメントのインデックスを作成できることを意味します。
もう 1 つは、Esmy はドキュメントとは何かについて、より独自の (しかしオープンな) 見解を持っていることです。 Lucene は入力時にドキュメントを一連のフィールドとして扱いますが、読み取り時にはドキュメントという概念はありません。これにより、たとえば、JSON を文字列フィールドとして保存することで、JSON 構造をエミュレートする Elasticsearch が実現されます。 Lucene は Elasticsearch ではないため、Lucene はその_source
フィールドを使用できず、Lucene はそのフィールドを使用できません。代わりに、Esmy にはドキュメントとディスク上のデータ構造という概念があります。これは、Esmy がその文書を使用できることを意味します。
このリポジトリは、Wikipedia から取得されテスト目的でのみ使用されるデータ ディレクトリ内のデータを除き、Apache License バージョン 2.0 ライセンスに基づいてライセンスされています。