Lucene 8.6.1 인덱스에서 모든 토큰 목록을 얻는 방법은 무엇입니까?

Nov 20 2020

Solr / Lucene 인덱스에서 모든 토큰 목록을 얻는 방법을 살펴 보았습니다 . 그러나 Lucene 8.6.1은 IndexReader.terms(). 이동 또는 교체 되었습니까? 이 답변 보다 쉬운 방법 이 있습니까?

답변

2 andrewjames Nov 20 2020 at 09:03

일부 역사

당신은 물었습니다. 나는 단지 IndexReader.terms()다른 곳으로 옮겨 졌거나 대체되었는지 궁금합니다 .

Lucene v3 방법 IndexReader.terms()은 AtomicReaderLucene v4에서 이동되었습니다 . 이것은 v4 알파 릴리스 노트 에 문서화되었습니다 .

(Lucene v4는 2012 년에 출시되었습니다.)

AtomicReaderv4 의 메서드 는 필드 이름을 사용 합니다.

v4 릴리스 노트에 다음과 같이 설명되어 있습니다.

한 가지 큰 차이점은 필드와 용어가 이제 별도로 열거된다는 것입니다. TermsEnum은 용어가 아닌 단일 필드 내에서 용어 당 BytesRef (byte []를 래핑)를 제공합니다.

핵심 부분은 "단일 필드 내의 용어 당" 입니다. 따라서 그 시점부터는 색인에서 모든 용어를 검색하기위한 단일 API 호출이 더 이상 없었습니다.

이러한 접근 방식은 이후 릴리스를 통해 실시하고있다 - 것을 제외 AtomicReader하고 AtomicReaderContext클래스가 이름이 바뀐 LeafReaderLeafReaderContext루씬의 V 5.0.0에서. Lucene-5569를 참조하십시오 .

최근 출시

그러면 용어 목록에 액세스 할 수있는 기능이 생겼지 만 필드별로 만 가능합니다.

다음 코드는 Lucene의 최신 릴리스 (8.7.0)를 기반으로하지만 Java를 사용하는 예제에서 언급 한 버전 (8.6.1)에도 적용됩니다.

private void getTokensForField(IndexReader reader, String fieldName) throws IOException {
    List<LeafReaderContext> list = reader.leaves();

    for (LeafReaderContext lrc : list) {
        Terms terms = lrc.reader().terms(fieldName);
        if (terms != null) {
            TermsEnum termsEnum = terms.iterator();

            BytesRef term;
            while ((term = termsEnum.next()) != null) {
                System.out.println(term.utf8ToString());
            }
        }
    }
}

위의 예는 다음과 같은 색인을 가정합니다.

private static final String INDEX_PATH = "/path/to/index/directory";
...
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(INDEX_PATH)));

필드 이름을 열거해야하는 경우이 질문 의 코드 가 시작점을 제공 할 수 있습니다.

최종 참고

주석에서 언급했듯이 필드 단위가 아닌 문서 단위로 용어에 액세스 할 수도 있습니다 . 나는 이것을 시도하지 않았다.