안녕하세요
새 레코드로 자주 업데이트되는 lucene 인덱스가 있습니다. 색인에 5,000,000 개의 레코드가 있고 FieldCache를 사용하여 숫자 필드 중 하나를 캐싱하고 있습니다. 하지만 인덱스를 업데이트 한 후 다시 FieldCache를 다시로드하는 데 시간이 걸립니다. (캐쉬 원인 문서를 다시로드하면 DocID가 안정적이지 않습니다.) 그래서 새로 추가 된 DocID 만 FieldCache에 추가하여이 오버 헤드를 최소화 할 수 있습니다.이 기능으로 인해 병목 현상이 발생합니다. 신청.자주 업데이트하는 인덱스가있는 FieldCache
IndexReader reader = IndexReader.Open(diskDir);
int[] dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, "newsdate"); // This line takes 4 seconds to load the array
dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, "newsdate"); // this line takes 0 second as we expected
// HERE we add some document to index and we need to reload the index to reflect changes
reader = reader.Reopen();
dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, "newsdate"); // This takes 4 second again to load the array
나는 거기에 성능을 향상 시키려면이 http://invertedindex.blogspot.com/2009/04/lucene-dociduid-mapping-and-payload.html 같은 기술이지만 여전히 우리가 이미 가지고있는 모든 문서를로드하고 우리의 배열의 인덱스 만 새로 추가 된 문서를 추가하여이 시간을 최소화하는 메커니즘을 원한다 우리가 새로 추가 한 문서를 배열에 추가하는 방법을 찾으면 모두 다시로드 할 필요가 없다고 생각합니다.
코드의 문제점은 내/외부 판독기로 설명하는 것입니다.외부 판독기 인 DirectoryReader를 FieldCache에 전달합니다. 두 명의 독자가 다르고 개별적으로 캐시한다고 생각합니다. 세그먼트별로 세그먼트를 채우기 위해 가장 안쪽의 리더 인 세그먼트 리더를 사용해야합니다. 즉, Reopen을 호출 한 후에 만 변경 내용을로드합니다. 몇 분 안에이 코드를 게시 할 것입니다. – sisve