분산 Lucene 개요
NCache 를 제공합니다 루센 Lucene을 사용하여 텍스트 검색에 사용할 수 있는 모듈 NCache. 각 서버의 NCache 전용 Lucene 모듈이 있습니다. 이것은 Lucene을 분산, 확장 및 고가용성으로 만듭니다. NCache.
주의 사항
이 기능은 NCache Enterprise 와 전문 서비스 위한 분할된 토폴로지 로 작성되어야 합니다.
주의 사항
NCache Lucene.Net 4.8 버전을 사용합니다.
Lucene을 함께 사용해야 하는 이유 NCache?
우리가 알고 있듯이 Lucene은 비즈니스 요구 사항을 충족하기 위해 광범위한 텍스트 검색 기술을 제공하는 강력하고 효율적인 검색 엔진입니다. 사용자에게 제공되는 선택 사항이 다양하기 때문에 Lucene은 다른 텍스트 검색 엔진보다 훨씬 더 뛰어납니다. 강력한 검색 알고리즘을 갖추고 있으며 광범위한 검색 쿼리를 지원합니다.
Lucene은 그 자체로도 강력하지만 한계가 있습니다. Lucene은 클라이언트 애플리케이션에서 프로세스 내에서 실행됩니다. 이것은 Lucene이 확장 가능하지 않으며 단일 실패 지점이 있음을 의미합니다.
NCache API의 사소한 변경으로 Lucene의 분산 구현을 제공합니다. Lucene의 API 호출 NCache 백엔드에서. NCache Lucene과 함께 자연적으로 분산되기 때문에 애플리케이션에 의해 인덱싱된 문서가 개별적으로 인덱싱되는 캐시 노드 간에 자동으로 분산되므로 선형 쓰기 확장성을 제공합니다.
주의 사항
Distributed Lucene은 대신 별도의 전용 Lucene 저장소를 사용합니다. NCache 캐시 저장소.
마찬가지로 Distributed Lucene은 쿼리가 각 파티션에 전파되고 결과가 병합되므로 선형 읽기 확장성을 제공합니다. 파티션 수가 많을수록 더 많은 양의 읽기 및 쓰기 확장성을 제공합니다. Lucene 색인은 실제 드라이브에 유지됩니다. 노드가 많을수록 많은 수의 Lucene 문서와 인덱싱된 데이터를 수용할 수 있는 확장성, 성능 및 저장 용량이 높아집니다.
분산 Lucene의 작업
중대한
HDD 대신 SSD를 사용하여 Lucene 문서를 색인화하고 검색하는 것이 좋습니다.
Lucene과 Distributed Lucene의 동작과 작동은 몇 가지 변경 사항을 제외하면 거의 동일합니다. Distributed Lucene의 워크플로, 데이터 배포 및 구성 요소는 다음 섹션에서 설명됩니다.
분산 Lucene 워크플로
아래 다이어그램은 분산 Lucene 모델의 작동 방식을 보여줍니다.
클라이언트 애플리케이션은 Lucene API를 사용하여 문서를 색인화 및 분석(지원되는 Lucene 분석기로 분석)하거나 기존 색인화된 문서를 쿼리할 수 있습니다. API를 사용한 이러한 작업은 RPC(원격 프로시저 호출)처럼 작동하며 NCache 무리. 클러스터는 이러한 호출의 성격을 결정하고 각 서버 노드에 연결된 Distributed Lucene 모듈에 호출을 전달합니다. 이러한 모듈은 이러한 호출을 실행하고 호출의 특성에 따라 다음 작업 중 하나가 발생합니다.
쿼리 문서 호출: 쿼리 호출인 경우 Distributed Lucene 모듈은 결과를 클라이언트 측에 반환하며, 여기서 이러한 모든 결과가 병합되고 처리됩니다.
색인 문서 호출: 문서를 인덱싱하기 위한 호출인 경우 분산 Lucene 모듈은 해당 문서를 디스크 드라이브에 유지합니다.
데이터 배포
캐시 클러스터에 대해 분산 맵이 생성됩니다. Distributed Lucene의 경우 다음 맵이 생성됩니다.
- 캐시 생성 시.
- 서버 노드 추가 또는 제거 시.
경고
분포 맵이 존재하지 않는 경우 캐시가 시작되지 않고 이벤트 뷰어 및 서비스 로그에 예외가 기록됩니다.
이 맵에는 캐시 노드에 대한 버킷에 대한 정보가 포함되어 있습니다. Distributed Lucene 캐시의 총 버킷 수는 100개입니다. 이 100개 버킷은 특정 전략을 사용하여 클러스터에 분산됩니다.
버킷이 100개라는 것은 인덱스가 캐시 클러스터 전체에서 100개의 하위 인덱스로 분할된다는 의미입니다. 각 노드에 할당된 버킷 수에 따라 모든 해당 인덱스 파일도 해당 특정 노드로 이동됩니다. 따라서 상태 전송으로 인해 캐시 클러스터에서 버킷이 이동할 때마다 해당 인덱스 파일도 프로세스의 일부로 이동됩니다.
서버 노드에는 여러 인덱스가 포함될 수 있으며 해당 서버 노드 내의 각 인덱스에는 클러스터의 배포 전략에 따라 할당된 버킷이 포함됩니다. 인덱스에 대한 문서는 이러한 버킷을 통해 균등하게 배포됩니다. 이러한 인덱스는 실제 드라이브에도 유지됩니다.
NCache 런타임 또는 동적 배포가 있습니다. 노드 시작 또는 중지는 캐시 클러스터의 배포 맵 변경을 트리거하고 상태 전송을 트리거합니다. 그러나 NCache 분산형 Lucene에서는 인덱스가 물리적 드라이브에 유지되어 노드 시작 또는 중지 시 불필요한 인덱스 배포를 방지합니다. 즉, NCache 분산 Lucene에서는 캐시 클러스터에서 노드를 추가하거나 제거하는 것만으로 분산 맵이 변경되고 실행 중인 서버 노드에 대한 상태 전송이 트리거됩니다. 중지된 서버 노드의 경우 다시 온라인 상태가 되면 상태 전송이 수행됩니다.
다음은 고려해야 할 몇 가지 중요한 사항입니다. NCache 분산 루신:
- 캐시 분포 맵: 새 캐시의 배포 맵은 캐시 생성이 성공한 경우에만 생성됩니다. 어떤 이유로 배포 맵 생성이 실패하면 캐시 생성이 롤백(되돌리기)됩니다.
- 상태 이전: 캐시 클러스터 구성원의 구성이 변경되면 캐시 클러스터에서 상태 전송이 트리거되기 때문에 배포 맵이 변경됩니다.
- 기존 클러스터에 노드 추가: 이 경우 모든 서버 노드(추가되는 노드 포함)는 물리적으로 사용 가능해야 하며 해당 서비스가 실행 중이어야 합니다. Distributed Lucene 캐시 클러스터에 노드가 추가되면 기존 서버 노드에서 기존 배포 맵을 가져옵니다. 그런 다음 새 배포 맵이 생성되어 모든 서버 노드와 공유됩니다. 이 배포 맵을 유지하기 위해 커밋 호출이 전송됩니다.
- 기존 클러스터에서 노드 제거: 이 경우 기존 클러스터에 노드를 추가하는 것과 유사하게 모든 서버 노드(제거되는 노드 제외)가 물리적으로 사용 가능해야 하며 해당 서비스가 실행 중이어야 합니다. 그렇지 않으면 이 작업이 실패합니다.
- 상태 이전 중 노드 종료: 상태 전송 중에 서버 노드가 종료되면 해당 노드에 대한 상태 전송이 중단되고 노드가 다시 시작될 때 동일한 버킷(노드가 종료되는 위치)에서 재개됩니다.
중대한
개발자 설치의 경우 매장에서는 Distributed Lucene을 구성할 수 있습니다.
분산 Lucene 초기화
Distributed Lucene을 사용하여 문서를 색인화하고 나중에 검색하기 전에 다음을 수행해야 합니다. 초기화 먼저 그것. 초기화한 후에는 캐시 이름과 인덱스 이름을 제공해야 합니다.
인덱스 데이터
Distributed Lucene의 인덱싱 프로세스는 Lucene 자체와 동일합니다. 분산 루씬의 경우, NCache 문서 배포를 위한 키-값 저장소를 유지 관리하고 자동 생성된 키가 각 문서에 추가됩니다. 문서는 해당 특정 키에 대해 노드에서 인덱싱됩니다.
인덱스 검색
Distributed Lucene이 초기화되고 문서가 인덱싱되면 이러한 문서에서 텍스트 기반 검색을 수행할 수 있습니다.
패싯
카테고리는 색인된 문서를 분류하는 데 사용되는 필수 요소입니다. 예를 들어, 전자상거래 매장에서 옷을 검색할 때 옷의 카테고리는 가격, 소재, 브랜드 등이 될 수 있습니다.
패싯 검색에서는 일반 검색 결과 외에 특정 카테고리에 대한 하위 카테고리로 구성된 패싯 결과도 얻을 수 있습니다. 위의 예를 계속하면 소재 패싯의 하위 카테고리는 면, 울, 가죽 등이 될 수 있습니다.
패싯 검색을 사용하면 필요한 특정 문서를 매우 쉽게 검색할 수 있습니다. NCache 이제 Distributed Lucene을 사용하여 Facets를 지원하므로 원하는 문서를 효율적이고 효과적으로 작성하는 데 도움이 됩니다. Lucene과 Distributed Lucene의 패싯 작업은 대부분 동일하지만 성능이 많이 향상되었습니다. 분산된 Lucene 패싯.
지리 공간 API
경도와 위도의 좌표 값을 포함하는 데이터는 지리 공간 데이터. 이 데이터는 위치를 기준으로 데이터를 검색하려는 경우에 유용합니다. 예를 들어, 레스토랑 정보가 포함된 문서를 인덱싱하려고 합니다. 이 문서에는 다양한 필드가 포함되어 있으며 해당 필드 중 하나에는 경도 및 위도 값이 포함되어 있습니다. 나중에 이 문서를 위치(예: 가장 가까운 레스토랑)를 기준으로 검색하려면 경도 및 위도 필드도 인덱싱해야 합니다.
Lucene에는 매우 강력한 지리 공간 데이터 인덱싱 및 검색 기능이 있습니다. NCache 또한 Lucene API를 사용하여 해당 위치와 관련하여 문서를 색인화한 다음 검색할 수 있습니다. 다음 링크는 데이터를 색인화하고 검색하는 방법을 이해하는 데 도움이 됩니다. 분산 Lucene 지리 공간 API 안내
부분 클러스터의 분산 Lucene 동작
캐시 클러스터는 내부에 있는 하나 이상의 노드를 사용할 수 없게 되면 부분적으로 선언됩니다. 따라서 연결이 제한되어 캐시 클러스터가 부분 클러스터가 됩니다. 부분 클러스터에서 분산 Lucene의 동작은 아래에 설명되어 있습니다.
부분 클러스터에 대한 읽기 작업
NCache Distributed Lucene을 사용하면 값을 설정하여 부분 클러스터에서 데이터를 검색(읽기)할 수 있습니다. AllowPartialResults
재산 TRUE
를 시청하여 이에 대해 더 많은 정보를 얻을 수 있습니다. IndexReader
클래스 인스턴스. 기본적으로 값은 AllowPartialResults
플래그가 설정됩니다 FALSE
.
이러한 읽기 작업은 부분적이거나 불완전한 데이터를 반환합니다. 그러나 다음의 경우 파티션-복제본 토폴로지, 캐시 클러스터는 복제본을 통해 단일 노드 오류를 허용하고 완전한 데이터를 검색할 수 있습니다. 그러나 다중 노드 장애의 경우 일부 데이터만 검색할 수 있습니다.
경고
부분 클러스터에서 데이터를 읽으려고 하고 값을 설정한 경우 AllowPartialResults
플래그 FALSE
, 예외가 발생합니다.
부분 클러스터에 대한 쓰기 작업
Distributed Lucene에서는 부분 클러스터에서 추가, 업데이트 및 삭제와 같은 쓰기 작업을 수행할 수 없습니다. 부분 클러스터에서 이러한 작업을 수행하려고 하면 예외가 발생합니다.
지원되지 않는 Lucene API
아래에는 Distributed Lucene에서 지원되지 않는 Lucene API 목록이 나와 있습니다.
DirectoryReader
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexCommit commit)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexWriter writer, bool applyAllDeletes)
IndexSearcher
public IndexSearcher(IndexReaderContext context, TaskScheduler executor)
public Document Document(int docID, ISet<string> fieldsToLoad)
public virtual Weight CreateNormalizedWeight(Query query)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort, bool doDocScores, bool doMaxScore)
IndexReader
public static DirectoryReader Open(Directory directory)
public static DirectoryReader Open(Directory directory, int termInfosIndexDivisor)
public static DirectoryReader Open(IndexWriter writer, bool applyAllDeletes)
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public IList<AtomicReaderContext> Leaves
NCacheDirectory
public override string[] ListAll()
public override long FileLength(string name)
public override void DeleteFile(string name)
public override string GetLockID()
public override IndexInput OpenInput(string name, IOContext context)
CompositeReader
public override sealed IndexReaderContext Context
추가 자료
NCache Distributed Lucene에 대한 샘플 애플리케이션을 제공합니다. GitHub의.