루센 .NET 전체 텍스트 검색 엔진 라이브러리에는 전체 텍스트 인덱스를 만들고 프로그램에 고급 및 정밀 검색 기술을 구현하기 위한 강력한 API가 포함되어 있습니다. Lucene은 사용자에게 주어진 선택이 다양하기 때문에 다른 텍스트 검색 엔진에서 기대하는 것보다 훨씬 더 많은 것을 제공합니다. 강력한 검색 알고리즘을 가지고 있으며 검색을 위한 광범위한 쿼리를 지원합니다.
Lucene은 그 자체로 강력하지만 제한이 없는 것은 아닙니다. Lucene은 클라이언트 응용 프로그램에서 프로세스 내에서 실행되며 Lucene 응용 프로그램은 일반적으로 파일에 데이터를 쓰고 디스크에 저장하므로 막대한 메모리 할당이 발생합니다. 그러나 데이터가 증가함에 따라 확장되지 않는 독립 실행형 솔루션이므로 데이터를 검색하기 위해 전체 Lucene 인덱스를 다시 작성해야 하며 이는 비용이 많이 들고 느린 작업으로 성능 병목 현상이 발생할 수 있습니다. 이것은 Lucene이 확장 가능하지 않으며 단일 실패 지점이 있음을 의미합니다.
NCache 세부 정보 다운로드 NCache NCache 기술 문서
분산 Lucene이 도움이 되는 방법
NCache Lucene 응용 프로그램을 확장 가능하게 만드는 Lucene의 분산 구현을 제공합니다. NCache Lucene과 함께 자연적으로 분산되기 때문에 애플리케이션에 의해 인덱싱된 문서가 개별적으로 인덱싱되는 캐시 노드 간에 자동으로 분산되므로 선형 쓰기 확장성을 제공합니다.
마찬가지로 Distributed Lucene은 쿼리가 각 파티션에 전파되고 결과가 병합되기 때문에 선형 읽기 확장성을 제공합니다. 파티션 수가 많을수록 읽기 및 쓰기 확장성이 높아집니다. Lucene 인덱스는 물리적 드라이브에 유지됩니다. 노드가 많을수록 많은 Lucene 문서와 인덱싱된 데이터를 수용할 수 있는 확장성, 성능 및 저장 용량이 높아집니다.
NCache 세부 정보 다운로드 NCache 분산 Lucene 문서
분산 Lucene의 작동 방식
분산 루신 여러 서버 노드를 포함하며 각 서버는 NCache 전용 Lucene 모듈이 있습니다. Lucene과 Distributed Lucene의 동작과 작동은 몇 가지 변경 사항을 제외하고 유사합니다.
아래 다이어그램은 Distributed Lucene 모델의 작동 방식을 보여줍니다.
클라이언트 응용 프로그램은 Lucene API를 사용하여 문서를 인덱싱하거나 기존 인덱싱된 문서를 쿼리할 수 있습니다. API와의 이러한 상호 작용은 클라이언트와 서버 간의 RPC(원격 프로시저 호출)처럼 작동합니다. API 호출은 각 서버 노드에 연결된 Lucene 모듈로 직접 전달됩니다. Lucene 모듈은 이러한 호출을 실행하고 호출의 특성에 따라 다음 작업 중 하나가 발생합니다.
- 쿼리 호출인 경우 Distributed Lucene 모듈은 클라이언트 측에 결과를 반환하고 여기에서 이러한 모든 결과가 병합되고 처리됩니다.
- 문서 인덱싱을 위한 호출인 경우 분산 Lucene 모듈은 해당 문서를 디스크 드라이브에 유지합니다.
NCache 세부 정보 분산 Lucene 문서 분산 Lucene 캐시
데이터 배포
에 대한 분포도가 생성됩니다. NCache 분산 Lucene용 클러스터. 이 맵에는 캐시 노드에 대한 버킷 배포에 대한 정보가 포함되어 있습니다. 이러한 버킷(맵에 100개의 버킷이 있음)은 특정 전략을 사용하여 클러스터에 배포됩니다. 클러스터에서 노드를 추가하거나 제거하면 배포 맵이 변경되고 실행 중인 서버 노드에 대한 상태 전송이 트리거되어 각 노드에서 인덱싱된 데이터가 있는 버킷을 전송합니다.
100개의 버킷이 있다는 것은 Lucene 인덱스가 전체에 걸쳐 100개의 하위 인덱스로 분할된다는 것을 의미합니다. NCache 무리. 단일 버킷에는 Lucene.Net의 Lucene 인덱스와 동일한 하위 인덱스가 포함됩니다. 서버 노드에는 여러 인덱스가 포함될 수 있으며 해당 서버 노드 내의 각 인덱스에는 클러스터의 배포 전략에 따라 할당된 버킷이 포함됩니다. 인덱스 내부의 데이터는 이러한 버킷을 통해 고르게 분산됩니다.
분산 Lucene으로 시작하는 방법
분산 Lucene은 Lucene과 동일하게 작동합니다. 분산 Lucene을 사용할 때의 한 가지 주요 편의는 다음과 동일한 API를 제공한다는 것입니다. 루센. Lucene 사용자는 한 줄 코드 변경의 추가 기능으로 원하는 확장성을 얻을 수 있습니다. 사용하기만 하면 된다 NCache 디렉토리와 응용 프로그램을 사용할 수 있습니다. 배포된 Lucene에는 동작 및 API 변경 사항이 거의 없으며 선적 서류 비치.
기술적인 측면에서 이러한 단계를 자세히 살펴보고 기본 단계는 라이브러리의 Lucene.NET Nuget 패키지를 Distributed Lucene Nuget 패키지로 바꾸는 것입니다. 루신넷.NCache.
에 연결 중 NCache 명부 담당
NCache 디렉토리는 이름에서 알 수 있듯이 확장 가능한 인덱스를 만들기 위한 인덱스를 저장하기 위한 기본 클래스입니다. 따라서 첫 번째 단계는 와 연결 NCache 명부 담당.
다음은 캐시에 연결하는 코드입니다. 루씬캐시 모든 서버에서 제공된 디렉토리를 엽니다.
1 2 3 4 5 6 7 8 9 |
// Specify the cache name that is used for Lucene string cache = "LuceneCache"; // Specify the index name to create the indexes string indexName = "ProductIndex"; // Create a directory and open it on the cache and the index path NCacheDirectory ncacheDirectory = NCacheDirectory.Open(cache, indexName); |
NCache 세부 정보 분산 Lucene 지리 공간 API 분산 Lucene 초기화
분산 Lucene의 인덱스 데이터
디렉토리가 초기화되면, IndexWriter
문서를 생성 Lucene.NET에서와 동일한 메커니즘을 사용하여 인덱스에서 AddDocument
방법. 문서를 작성할 때, IndexWriter.Commit
문서를 유지하고 검색 가능하게 만들기 위해 호출됩니다.
Distributed Lucene을 사용하면 병렬 인덱싱을 위해 동일한 디렉토리에서 여러 작성기를 열 수 있습니다. 아래 코드 샘플은 Distributed 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 |
// Create an instance of the writer IndexWriter indexWriter = new IndexWriter(ncacheDirectory, new IndexWriterConfig(LuceneVersion.LUCENE_48, new WhitespaceAnalyzer(LuceneVersion.LUCENE_48))); // Indexing // Add the products information that is to be indexed Product[] products = FetchProductsFromDB(); foreach (var prod in products) { // Create a document and add fields to it Document doc = new Document(); doc.Add(new TextField("ProductID", prod.ProductID, Field.Store.YES)); doc.Add(new TextField("ProductName", prod.ProductName, Field.Store.NO)); doc.Add(new TextField("Category", prod.Category, Field.Store.YES)); doc.Add(new TextField("Description", prod.Description, Field.Store.YES)); // Writer is created previously indexWriter.AddDocument(doc); } // Calling commit on the writer saves all the write operations indexWriter.Commit(); // Dispose the objects after indexing indexWriter?.Dispose(); ncacheDirectory?.Dispose(); |
NCache 세부 정보 분산된 Lucene 패싯 분산 루신 인덱싱
분산 Lucene에서 검색
수색 데이터를 인덱싱한 후에 수행할 수 있습니다. 그만큼 IndexSearcher
를 사용하여 IndexReader
결과를 가져오기 위해. 그만큼 IndexSearcher
주어진 쿼리에 따라 데이터를 검색하는 책임이 있습니다. Lucene은 광범위한 쿼리를 제공하며 Distributed Lucene은 모든 Lucene 쿼리를 지원합니다.
아래 코드 샘플은 Distributed Lucene을 사용하여 인덱싱된 문서를 검색하는 방법을 보여줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Open a new reader instance IndexReader reader = DirectoryReader.Open(ncacheDirectory); // A searcher is open to perform searching IndexSearcher indexSearcher = new IndexSearcher(reader); // Specify analyzer type Analyzer analyzer = new WhitespaceAnalyzer(version); // Create a query parser and parse the query with the parser //Specify the searchTerm and the fieldName QueryParser parser = new QueryParser(LuceneVersion.LUCENE_48, "Category", analyzer); Query query = parser.Parse("Beverages"); // Returns the top 10000 hits from the result set ScoreDoc[] docsFound = indexSearcher.Search(query, 10000).ScoreDocs; indexSearcher?.Dispose(); reader?.Dispose(); |
NCache 세부 정보 분산 Lucene 카운터 분산 루신 검색
분산 Lucene과 함께 기본 Lucene 인덱스 사용
Lucene을 사용하는 .NET 애플리케이션이 이미 있는 경우 대규모 Lucene 인덱스가 빌드되었을 가능성이 있습니다. NCache 제공 가져오기-LuceneIndex 사용자가 기존 Lucene 인덱스를 NCache 인덱스를 재구축할 필요 없이 분산된 Lucene.
이 예제 명령은 다음에서 기본 Lucene 인덱스를 로드합니다. C:\인덱스 분산 Lucene 저장소로 데모캐시.
1 |
Import-LuceneIndex -CacheName demoCache -Path C:\Index -Server 20.200.21.11 |
NCache 세부 정보 분산 Lucene 문서 Lucene 인덱스 가져오기
결론
Lucene은 데이터에 대한 전체 텍스트 검색을 수행하기 위한 매우 효율적인 검색 엔진이지만 확장성이 부족합니다. NCache Lucene과 함께 사용하여 아주 적은 노력으로 확장할 수 있습니다. 확장 가능한 분산 Lucene은 애플리케이션을 더 빠르게 만들 뿐만 아니라 단일 실패 지점의 주요 장애를 처리하는 데도 도움이 됩니다. NCache 한 줄의 코드 변경으로 .NET 응용 프로그램에 쉽게 연결할 수 있으므로 확장 가능한 Lucene 응용 프로그램에 가장 적합한 옵션이라고 생각하십시오.