2017-12-20 4 views
1

Lucene.Net의 큰 색인에 대해 색인 된 (그러나 저장되지 않은) 용어를 모두 검색하려면 어떻게해야합니까?큰 Lucene.Net 색인에서 모든 색인 된 용어를 얻는 방법은 무엇입니까?

내가 Lucene.Net에서 최신 Apache Lucene 릴리스로 이동하고 인덱스 형식이 릴리스에서 여러 번 변경 되었기 때문에 내가이 작업을 수행하는 이유가 있습니다. 용어를 읽고 새로운 형식으로 다시 색인을 지정하여 데이터를 이전합니다. 나는 Lucene 코덱 패키지에 대해 알고 있지만, Lucene.Net에서 사용하는 형식에 대해서는 충분히 뒤집을 수있는 호환성을 제공하지 않습니다.

비슷한 질문이 있습니다. Find list of terms indexed by Lucene

그러나 위의 방법의 문제점은 IndexReader.Terms이 색인에서 모든 용어를 읽음으로써 큰 ​​색인에서 OutOfMemoryException이 발생한다는 것입니다.

큰 인덱스의 모든 용어를 메모리 부족없이 정상적으로 가져올 수 있습니까?

예제 코드 (즉 reader.Terms(orderBy)에 대한 호출에 OutOfMemoryException를 throw) :

var results = new List<string>(); 
var orderBy = new Term("MyField", string.Empty); 
using (var reader = IndexReader.Open(FSDirectory.Open(_indexPath), true)) 
using (var termEnum = reader.Terms(orderBy)) 
{ 
    for (var term = termEnum.Term; term != null; termEnum.Next(), term = termEnum.Term) 
    { 
     if (term.Field != "MyField") 
     { 
      break; 
     } 
     results.Add(term.Text); 
    } 
} 

답변

2

코드를 보면, 당신이 모든을 작성하기 때문에이 시나리오에서 메모리가 부족할 수있는 유일한 이유 인 것 같다 용어는 List<string>입니다. 메모리 부족을 방지하려면 문자열을 디스크에 유지해야합니다.

var orderBy = new Term("MyField", string.Empty); 
using (var reader = IndexReader.Open(FSDirectory.Open(_indexPath), true)) 
using (var termEnum = reader.Terms(orderBy)) 
using (var stream = new FileStream("TheFile.txt", FileMode.Create, FileAccess.Write)) 
using (var writer = new StreamWriter(stream)) 
{ 
    for (var term = termEnum.Term; term != null; termEnum.Next(), term = termEnum.Term) 
    { 
     if (term.Field != "MyField") 
     { 
      break; 
     } 
     writer.WriteLine(term.Text); 
    } 
} 

이 귀하의 질문에, 당신은 당신이 메모리가보다 인덱스에서 더 많은 조건을 끌어하려고한다는 사실에 대답 수 있지만

은 잘못된 질문을하는 표시이다. 나는 당신이하려고하는 실제 과제를 보여주는 또 다른 질문을 던질 것을 제안합니다 - 아마도 색인에서이 원시 데이터를 모두 읽는 것보다 더 나은 (보다 효율적인) 방법이있을 가능성이 큽니다.

관련 문제