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는 새로운 데이터 구조를 추가할 수 있도록 구성되었습니다.
Lucene과 같은 Esmy는 인덱스와 세그먼트를 중심으로 구성됩니다. 세그먼트는 디스크에 있는 데이터 구조의 모음이고 인덱스는 세그먼트 집합입니다. 세그먼트는 변경할 수 없습니다. Esmy에 문서를 추가할 때 디스크에 커밋된 일부 문서를 추가하면 세그먼트가 생성됩니다. 시간이 지남에 따라 이는 많은 작은 세그먼트를 의미합니다. 작은 세그먼트가 너무 많이 발생하는 것을 방지하기 위해 Esmy는 세그먼트를 더 큰 세그먼트로 병합할 수 있습니다. 그런 다음 세그먼트의 디스크에 있는 데이터 구조를 사용하여 텍스트 검색과 같은 유용한 작업을 수행할 수 있습니다.
JVM에 있지 않다는 것 외에도 Lucene과 몇 가지 차이점이 있습니다.
하나는 Lucene이 반전된 인덱스를 라이브러리의 핵심으로 취급한다는 것입니다. 이는 Esmy의 중요한 기능이지만 유용한 데이터 구조 중 한 종류일 뿐입니다. 대신 Esmy에는 세그먼트 기능 이라는 개념이 있습니다. 반전된 인덱스는 이러한 세그먼트 기능 중 하나입니다. 세그먼트 기능에 대한 요구 사항은 문서 세트에서 세그먼트 기능을 만들 수 있고 기능이 작성한 파일을 더 큰 파일로 병합할 수 있다는 것입니다.
기능은 이름으로 식별되며 필드와 분리되어 있으므로 특정 필드에 대해 두 가지 이상의 색인 유형을 추가할 수 있습니다. 이는 예를 들어 Lucene에서와 같이 별도의 필드를 가질 필요 없이 다양한 분석기를 사용하여 문서를 색인화할 수 있음을 의미합니다.
또 다른 하나는 Esmy가 문서가 무엇인지에 대해 더 독단적인(그러나 개방적인) 견해를 가지고 있다는 것입니다. Lucene은 문서를 입력 시 필드 집합으로 처리하지만 읽을 때는 문서에 대한 개념이 없습니다. 예를 들어 JSON 구조를 갖는 Elasticsearch는 JSON을 문자열 필드로 저장하여 이를 에뮬레이트합니다. Lucene은 Elasticsearch가 아니기 때문에 Lucene은 해당 _source
필드를 사용할 수 없으며 Lucene은 해당 필드를 사용할 수 없습니다. 대신 Esmy는 문서 개념과 온디스크 데이터 구조를 가지고 있습니다. 이는 Esmy가 해당 문서를 사용할 수 있음을 의미합니다.
이 저장소는 Wikipedia에서 제공되고 테스트 목적으로만 사용되는 데이터 디렉토리의 데이터를 제외하고 Apache 라이센스, 버전 2.0 라이센스에 따라 라이센스가 부여됩니다.