데이터가 "새로운 통화"로 만들어지면서 Apache Lucene은 대중적인 전체 텍스트 검색 엔진으로 주목을 받았고 상당한 양의 텍스트 데이터에 대한 유연한 텍스트 검색을 통합하는 애플리케이션에서 널리 사용되었습니다. 루씬 사용 역 인덱싱, 특정 용어와 관련된 문서를 찾는 시간을 대폭 단축합니다.
NCache 세부 정보 분산 루신 NCache 기술 문서
그러나 데이터가 증가함에 따라 확장되지 않는 독립형 솔루션입니다. 데이터를 검색하려면 전체 Lucene 인덱스를 다시 빌드해야 하는데 이는 비용이 많이 들고 느린 작업으로 성능 병목 현상이 발생합니다. 현재 확장 가능한 전체 텍스트 검색을 제공하기 위해 몇 가지 Java 및 REST 기반 솔루션이 존재하지만 .NET 스택에 자연스럽게 맞을 수 있는 확장 가능한 전체 텍스트 검색 솔루션은 여전히 부족합니다.
분산 Lucene 사용 NCache .NET 용
NCache강력하고 인기 있는 .NET In-Memory Datastore는 분산 아키텍처를 통해 기본 Lucene.NET API를 구현했습니다. 표준 Lucene.NET API이므로 확장 가능한 방식으로 사용하기 위해 코드를 변경할 필요가 없습니다. NCache.
NCache 또한 이 Lucene.NET을 활용하여 동적으로 확장 가능한 환경에서 인덱스를 생성하여 분산된 전체 텍스트 검색. 이러한 검색 결과는 애플리케이션으로 다시 전송되기 전에 병합됩니다.
NCache 세부 정보 분산 Lucene의 작업 Lucene 구성 요소 및 개요
이것은 독립형 Lucene을 빠르고 선형적으로 확장 가능한 전체 텍스트 검색 솔루션으로 향상시킵니다.
NCache 세부 정보 엔터프라이즈 검색을 위한 분산 Lucene 분산 루신
.NET 앱에서 Lucene 사용
수천 개의 제품, 주문 및 고객 세부 정보에 대한 정보를 보유하고 있는 전자 상거래 사이트를 고려해 보겠습니다. 따라서 모든 속성, 특히 비텍스트 필드(검색하는 동안 사용되지 않음)를 인덱싱하는 것은 캐시 메모리를 소진하므로 현명한 접근 방식이 아닙니다.
예를 들어 제품에 대한 문서는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 |
{ “ID”: “ABC34”, “Name”: “Tupperware”, “Description”: “Microwaveable, dishwasher-friendly, reusable Tupperware in three sizes”, “RetailPrice”: 15.00, “Discount”: 3.00 } |
이제 우리는 고객이 문서의 한 필드인 제품 설명에 대해 전체 텍스트 검색을 수행한다는 것을 알고 있습니다. 그렇다면 검색할 수 있는 필드만 인덱싱하고 지속성 저장소(예: 데이터베이스 또는 파일 시스템)에서 해당 문서를 참조하는 키가 있는 경우 어떻게 됩니까? 이렇게 하면 특정 유형의 제품을 쿼리하면 "식기세척기 친화적인 Tupperware"라고 가정해 보겠습니다. 이러한 용어와 일치하는 설명이 있는 모든 제품은 문서 키로 ProductID와 함께 나타나며 전체 문서를 다음에서 가져올 수 있습니다. 지속 인덱스.
기존 애플리케이션에서 분산 Lucene을 사용하려면 다음을 지정하기만 하면 됩니다. NCache디렉토리를 열 때 디렉토리. 이것은 필요합니다 NCache 캐시 이름과 인덱스 이름. 다음 코드 스니펫은 캐시 LuceneCache에서 디렉토리를 엽니다. NCache 및 ProductIndex라는 색인이 있습니다.
1 2 3 4 5 6 7 |
// Specify the cache name and index path for Lucene string cache = "LuceneCache"; string index = "ProductIndex"; // Create directory and open it on the cache Directory directory = NCacheDirectory.Open(cache, index); |
Lucene은 주어진 문자열을 Lucene 쿼리로 해석하는 광범위한 쿼리 언어를 제공합니다. 이는 용어, 다중 용어, 와일드카드 또는 퍼지 단어에 대해 수행할 수 있습니다. Lucene 쿼리에 대해 자세히 알아보려면 Lucene 쿼리 문서.
다음 코드 스니펫은 IndexSearcher가 사용하는 디렉토리에 IndexReader를 생성합니다. 데이터는 StandardAnalyzer를 기반으로 분석되고 토큰화됩니다. 결과의 처음 50개 히트가 애플리케이션에 반환됩니다. 분석기는 인덱스 생성 중에 사용된 것과 동일해야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// The 'applyAllDeletes' is true so all enqueued deletes are applied on writer IndexReader reader = DirectoryReader.Open(indexWriter, true); // A searcher is opened to perform searching IndexSearcher indexSearcher = new IndexSearcher(reader); // Specify the searchTerm, fieldName and analyzer string searchTerm = "Beverages"; string fieldName = "Category"; // Note that the analyzer should be same as the one used during index creation Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48); // Create a query parser to parse the query QueryParser parser = new QueryParser(LuceneVersion.LUCENE_48, fieldName, analyzer); Query query = parser.Parse(searchTerm); // Returns the top 50 hits from the result set ScoreDoc[] docsFound = indexSearcher.Search(query, 50).ScoreDocs; reader.Dispose(); |
분산 인덱스를 구축하기 위해 데이터 로드
Lucene을 사용하면 인덱스를 구축하고 필요에 따라 인덱스에 데이터를 로드할 수 있습니다. 인덱스에는 필요에 따라 데이터를 분석하고 토큰화하는 분석기가 필요합니다. 공백, 문자가 아닌 것, 구두점 등이 될 수 있습니다. Lucene 색인에 대한 작성자를 만든 후에는 문서를 만들고 여기에 필드를 추가할 수 있습니다. 이 문서는 다음에서 색인화됩니다. NCache Commit()을 호출하면 분산 인덱스로 사용됩니다. Lucene 분석기에 대한 자세한 내용은 다음을 참조하십시오. Lucene 분석기 문서.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Specify the cache name and index path for Lucene string cache = "LuceneCache"; string indexPath = "ProductIndex"; // Create directory and open it on the cache Directory directory = NCacheDirectory.Open(cache, indexPath); // The same analyzer is used as for the reader Analyzer analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48); IndexWriterConfig config = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer); // Create indexWriter on NCache directory IndexWriter indexWriter = new IndexWriter(directory, config); Product[] products = FetchProductsToIndex(); foreach (var product in products) { Document doc = new Document { new StoredField("id", product.ID), new TextField("name", product.Name, Field.Store.YES), new TextField("description", product.Description, Field.Store.YES), new StringField("category", product.Category, Field.Store.No), new StoredField("retail_price", product.RetailPrice), }; indexWriter.AddDocument(doc); } indexWriter.Commit(); </code><br /><br /><a href="/ncache/">NCache Details</a> <a href="/resources/docs/ncache/prog-guide/lucene-ncache.html#working-of-distributed-lucene">Working of Distributed Lucene</a> <a href="/blogs/geospatial-indexes-for-distributed-lucene-with-ncache/">GeoSpatial Indexes for Distributed Lucene</a> |
NCache 분산 Lucene을 위해?
사용 NCache 분산 Lucene은 다음과 같은 이점을 제공합니다.
- 매우 빠르고 선형적으로 확장 가능: NCache 인 메모리 분산 데이터 저장소이므로 구축 분산된 Lucene 또한 전체 텍스트 검색에 대해 동일한 최적의 성능을 제공합니다. 게다가 때문에 NCache의 분산 아키텍처에서 Lucene 인덱스는 클러스터의 모든 서버에 분할됩니다. 따라서 데이터 로드가 증가함에 따라 이동 중에 더 많은 서버를 추가할 수 있고 Lucene 인덱스는 자동으로 redis클라이언트 개입 없이 공물.
- 안정성 및 고가용성을 위한 데이터 복제: 와 NCache의 Partition-of-Replica 토폴로지에서 Lucene 인덱스는 모든 서버에 걸쳐 분할될 뿐만 아니라 각 파티션도 클러스터의 다른 서버에 복제됩니다. 따라서 서버가 다운되면 파티션의 복제본이 t/resources/docs/에 대한 모든 쿼리를 처리합니다.ncache/admin-guide/distributed-lucene-counters.html모자 색인, 안정성 보장. 마찬가지로 서버 노드가 다운되면 NCache 동적으로 자가 치유 중단 시간이나 Lucene 인덱스에 대한 영향 없이 나머지 노드 내의 데이터를 재조정하여 고가용성을 보장합니다.
결론
요약하자면 전체 텍스트 검색은 이제 강력한 검색 엔진인 Lucene 덕분에 거의 모든 비즈니스에서 기본이 되었습니다. 그러나 데이터가 증가함에 따라 인덱스 재구축은 얻는 것보다 더 많은 손상을 초래할 수 있으며, 이는 다음과 같은 메모리 내 분산 .NET 솔루션이 NCache 필요한 것은 기존 Lucene 애플리케이션에서 한 줄의 코드만 변경하면 메모리 내 분산 전체 텍스트 검색 메커니즘으로 두 가지 장점을 모두 누릴 수 있다는 것입니다.