lucene은 문서를 어떻게 색인합니까?


95

Lucene에 대한 문서를 읽었습니다. 또한이 링크 ( http://lucene.sourceforge.net/talks/pisa ) 의 문서를 읽었습니다 .

Lucene이 문서를 색인화하는 방법을 정말로 이해하지 못하고 Lucene이 색인화에 사용하는 알고리즘을 이해하지 못합니까?

위의 링크에서 Lucene은 색인 생성에이 알고리즘을 사용한다고 말합니다.

  • 증분 알고리즘 :
    • 세그먼트 인덱스 스택 유지
    • 들어오는 각 문서에 대한 색인 생성
    • 스택에 새 인덱스 푸시
    • b = 10을 병합 인자로 둡니다. M = 8

for (size = 1; size < M; size *= b) {
    if (there are b indexes with size docs on top of the stack) {
        pop them off the stack;
        merge them into a single index;
        push the merged index onto the stack;
    } else {
        break;
    }
}

이 알고리즘은 최적화 된 인덱싱을 어떻게 제공합니까?

Lucene은 인덱싱을 위해 B- 트리 알고리즘 또는 이와 유사한 다른 알고리즘을 사용합니까? 아니면 특정 알고리즘이 있습니까?


여기에있는 대부분의 답변은 첫 번째 Lucene 반전 된 인덱스를 생성 한다는 것이 정확 하지만, 해당 용어 인덱스가 이후에 검색되는 방법 (그리고 OP가 실제로 요청한 내용)에 대한 핵심 포인트를 설명하지 않습니다 . 따라서 아래에서 더 나은 통찰력을 제공하는 다소 오래된 질문에 대한 새로운 답변을 찾으십시오.
fnl

1
현재 답변 (내 답변 포함!)이 OP의 주요 두 질문에 답하기에 실제로 만족스럽지 않기 때문에 내 답변을 다시 한 번 업데이트했습니다 (Lucene은 최적화 된 인덱싱을 제공하는 방법과 특정 알고리즘 (B- 트리가 아닌 Skip-List), BTW). 이제 최종 업데이트가 실제 질문에 제대로 답하기를 바랍니다!
fnl

답변:


54

여기에 상당히 좋은 기사가 있습니다 : https://web.archive.org/web/20130904073403/http://www.ibm.com/developerworks/library/wa-lucene/

2014 년 12 월 편집 : 원본이 삭제되어 보관 된 버전으로 업데이트되었습니다. 아마도 가장 최근의 대안은 http://lucene.apache.org/core/3_6_2/fileformats.html입니다.

http://lucene.apache.org/core/4_10_2/core/org/apache/lucene/codecs/lucene410/package-summary.html#package_description에 더 최신 버전이 있지만 정보가 적은 것 같습니다. 더 오래된 것보다.

간단히 말해서, lucene이 문서를 색인화하면 문서를 여러 용어로 나눕니다. 그런 다음 각 용어가 포함 된 문서와 연관된 색인 파일에 용어를 저장합니다. 해시 테이블과 비슷하다고 생각할 수 있습니다.

용어는 각 단어를 어근 형태로 추출하는 분석기를 사용하여 생성됩니다. 영어에서 가장 널리 사용되는 형태소 분석 알고리즘은 Porter 형태소 분석 알고리즘입니다. http://tartarus.org/~martin/PorterStemmer/

쿼리가 실행되면 인덱스를 작성하는 데 사용 된 동일한 분석기를 통해 처리 된 다음 인덱스에서 일치하는 용어를 조회하는 데 사용됩니다. 그러면 쿼리와 일치하는 문서 목록이 제공됩니다.


귀하의 답변과 링크에 감사드립니다. 하지만 Lucene 프로젝트에 "Snowball"이라는 특수 형태소 분석기가 있다고 들었습니다. 그것에 대해 들었습니까?
M.Amrollahi 2010

이것은 다른 질문입니다. lucidimagination.com/search/를 참조하십시오 . 그 외에는 질문 패턴을 확인하십시오. 'Lucene in Action'책을 읽어 보시기 바랍니다. manning.com/hatcher2 (초판은 약간 날짜가 있지만 죽은 나무 버전에서 찾을 수 있습니다. 두 번째 버전은 전자 책으로 구입할 수 있습니다).
Yuval F

5
대답을 수정할 수 있습니다. IBM 링크 인 첫 번째 링크를 찾을 수 없습니다. :)
Adelin

또한 필드는 전체 그림을 어떻게 입력합니까? 쿼리가 특정 필드에있는 경우 lucene은 문서를 가리키는 용어가 문서의 어디에도없고 요청 된 필드 안에 있음을 어떻게 그리고 어느 지점에서 알 수 있습니까?
Levon Tamrazov

44

간단히 말해서 Lucene은 디스크의 Skip-Lists 사용하여 반전 된 인덱스를 빌드 한 다음 FST ( 유한 상태 변환기)를 사용하여 인덱스 된 용어 대한 매핑을 메모리에 로드합니다 . 그러나 Lucene Lucene의 인덱싱 시스템을 직접 만든 Michael McCandless가 설명한대로 모든 인덱싱 된 용어를 RAM에로드하지 않습니다 (필수) . Skip-Lists를 사용하면 인덱스를 한 적중에서 다른 적중으로 순회 할 수 있으므로 집합 및 특히 범위 쿼리가 가능합니다 (B- 트리와 매우 유사 함). 그리고 Skip-Lists 색인화에 대한 Wikipedia 항목은 Lucene의 Skip-List 구현이 다중 레벨 이라고 불리는 이유를 설명 합니다.Skip-List-본질적으로 O(log n)조회를 가능하게합니다 (다시 말하지만 B- 트리와 매우 유사 함).

따라서 Skip-List 데이터 구조를 기반으로하는 반전 된 (용어) 인덱스 가 문서에서 빌드되면 인덱스가 디스크에 저장됩니다. 그런 다음 Lucene 은 Morfologick에서 느슨하게 영감받은 FST 구현에서 Finite State Transducer에 해당 용어를로드합니다 (이미 말했듯이, 아마도 일부만) .

Michael McCandless (또한)는 Lucene이 (최소 비순환) FST사용하여 Lucene이 메모리에 저장하는 용어를 SortedMap<ByteSequence,SomeOutput>. 이 매핑의 메모리 사용이 부선 형적으로 증가하도록 FST가 바이트 시퀀스 [즉, 색인 된 용어]를 압축하는 방법). 그리고 그는 Lucene이 사용 하는 특정 FST 알고리즘을 설명하는 논문도 지적합니다 .

대부분의 데이터베이스는 (B +를) 사용하는 동안 루씬은, 건너 뛰기-목록을 사용하는 이유는 그 호기심을 위해 - 및 / 또는 (B)를 - 트리, 한 번 봐 걸릴 바로 SO 답변 이 질문에 (B-나무 대 건너 뛰기-목록)에 관한합니다. 그 대답은 상당히 훌륭하고 깊은 설명을 제공합니다. 본질적으로 인덱스의 동시 업데이트를 "더 적절하게"그렇게 만들지는 않습니다 (왜냐하면 B- 트리를 즉시 재조정하지 않기로 결정할 수 있기 때문입니다. Skip-List) 대신 Skip-Lists를 사용하면 밸런싱 작업 (지연 여부에 관계없이) 작업을 하지 않아도 됩니다. (궁극적으로) B- 트리가 필요로합니다 (사실 답변에서 알 수 있듯이 B- 트리와 [다단계] Skip-Lists 중 하나가 "올바른 작업"인 경우에는 성능 차이가 거의 없습니다.)


1
Afaik 그들은 B-tree 대신 Skip List를 사용하여 디스크 검색 수를 줄이고 있습니다. Skip List의 일부가 메모리에 상주하고 인덱스를 순회 할 때 필요한 디스크 IO가 거의 없기 때문에
Anton

24

색인 자체보다 색인 병합에 대한 질문이 더 많은 것 같습니다.

낮은 수준의 세부 정보를 무시하면 인덱싱 프로세스가 매우 간단합니다. Lucene은 문서에서 "역 인덱스"라고하는 것을 형성합니다. 따라서 텍스트가 "To be or not be"이고 id = 1 인 문서가 들어 오면 반전 된 인덱스는 다음과 같습니다.

[to] → 1
[be] → 1
[or] → 1
[not] → 1

이것은 기본적으로 단어에서 주어진 단어를 포함하는 문서 목록 에 대한 색인입니다 . 이 색인 (단어)의 각 줄을 게시 목록이라고합니다. 이 인덱스는 장기 저장소에 유지됩니다.

물론 실제로 상황은 더 복잡합니다.

  • Lucene은 주어진 특정 분석기에 따라 일부 단어를 건너 뛸 수 있습니다.
  • 언어의 유연성을 줄이기 위해 형태소 분석 알고리즘을 사용하여 단어를 사전 처리 할 수 ​​있습니다.
  • 게시 목록에는 문서의 식별자뿐만 아니라 문서 내 주어진 단어의 오프셋 (잠재적으로 여러 인스턴스) 및 기타 추가 정보가 포함될 수 있습니다.

기본적인 이해에 그렇게 중요하지 않은 더 많은 합병증이 있습니다.

하지만 Lucene 색인은 추가 전용 이라는 것을 이해하는 것이 중요 합니다 . 어느 시점에서 애플리케이션은 인덱스의 모든 변경 사항을 커밋 (게시)하기로 결정합니다. Lucene은 색인을 사용하여 모든 서비스 작업을 완료하고 닫으므로 검색에 사용할 수 있습니다. 커밋 후 인덱스는 기본적으로 변경 불가능합니다. 이 색인 (또는 색인 부분)을 세그먼트 라고 합니다 . Lucene이 쿼리 검색을 실행하면 사용 가능한 모든 세그먼트에서 검색합니다.

그래서 질문이 생깁니다. 이미 색인 된 문서를 어떻게 변경할 수 있습니까?

새 문서 또는 이미 인덱싱 된 문서의 새 버전은 새 세그먼트에서 인덱싱되고 소위 kill list를 사용하여 이전 세그먼트에서 무효화 된 이전 버전 입니다. Kill list는 변경 될 수있는 커밋 된 인덱스의 유일한 부분입니다. 짐작할 수 있듯이 오래된 인덱스에는 대부분 제거 된 문서가 포함될 수 있으므로 인덱스 효율성은 시간이 지남에 따라 떨어집니다.

병합이 시작되는 곳입니다. 병합 – 전체적으로보다 효율적인 인덱스를 만들기 위해 여러 인덱스를 결합하는 프로세스입니다. 병합 중에 기본적으로 발생하는 것은 라이브 문서가 새 세그먼트에 복사되고 이전 세그먼트가 완전히 제거되는 것입니다.

이 간단한 프로세스를 사용하여 Lucene은 검색 성능 측면에서 인덱스를 양호한 상태로 유지할 수 있습니다.

도움이되기를 바랍니다.


1
따라서 가장 최신 결과를 먼저 찾기 위해 최신 세그먼트를 살펴 보는 것으로 검색이 시작됩니까? 따라서 명확히하기 위해 문서가 업데이트되었다고 가정합니다. 문서의 이전 버전이 킬 목록에 추가 된 다음 문서 ID가 킬 목록의 ID와 일치하면 이전 세그먼트에서 발견 된 일치 항목이 검색 결과에서 제거됩니까?
Joel B

2
그래 정확 해. 언급 할 유일한 것은 최종 순서가 정렬 규칙 (사소한 경우의 관련성 색인)을 사용하여 정의되므로 세그먼트가 검색되는 순서는 관련이 없다는 것입니다.
Denis Bazhenov

12

그것은되는 인덱스를 반전 ,하지만 그것을 사용하는 구조 지정하지 않습니다. lucene의 인덱스 형식 에는 완전한 정보가 있습니다.
'파일 확장자 요약'으로 시작하십시오.

먼저 다양한 인덱스에 대해 이야기하고 있음을 알 수 있습니다. 엄밀히 말하면 B- 트리를 사용하는 것은 아니지만 유사점이 있습니다. 위의 구조는 나무와 비슷합니다.


1
Lucene의 역 인덱스는 B- 트리가 아닌 스킵 목록을 기반으로합니다. 매우 넓은 의미에서 여전히 나무와 같은 구조이지만 완전해야합니다. 예를 들어이 SO 질문을 다시 참조하십시오 . 루씬의 스킵리스트의 사용스킵리스트 B-나무 위로 바람직 수 있습니다 이유 SO 질문 .
fnl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.