본문 바로가기

Lucene

[lucene] 색인 (Document 추가/삭제/갱신, 가중치)

Document의 변형
- 동일한 색인에서 하나의 Document에 서로 다른 여러개의 Field 집합을 가질 수 있다.
즉, '이름' ,'가격' Field를 가지는 Document나
'이름', '나이', '성별'을 가지는 Document를 색인 하나에 동시에
추가 할 수 있다.

-> 일반적인 검색엔진과 좀 다른 구조인듯...

String keyword = "dog";
String synonym [] = String {...};

Document doc = new Document();
Field field = new Field("word", keyword, Field.Store.YES, Field.Index.TOKENIZED);
doc.add(field);

for(int i = 0; i < synonym.length; i ++) {
Field field = new Field("word", synonym[i], Field.Store.YES, Field.Index.TOKENIZED);
doc.add(field);
}

이렇게 하나의 필드에 여러개의 단어를 색인 할 수 있다.이렇게 해도 루씬은 내부적으로 하나의 필드에 단어를 모두 모아 색인하며, 이렇게 추가한 단어로도 문서 검색이 가능하다.

Document 삭제
- 삭제는 IndexReader 클래스가 한다. (Writer 아님!)
- 삭제 메서드를 호출하더라도 삭제 표시만 해두고 이후 IndexReader를 close() 할때 삭제가 실행 된다.

IndexRead reader = IndexReader.open("경로");
reader.delete(1); //ID가 1인 doc 삭제 표시
reader.close(); //실제 삭제

maxDocs() -> 다음 색인 document가 추가 될때 그 Document의 ID
numDocs() -> 전체 Document 갯수

maxDocs()는 delete()하더라도 최적화가 되기 전까지는 변하지 않음
numDocs()는 삭제 표시만 해도 삭제된 것으로 가정하고 계산됨

IndexReader reader = IndexReader.open("경로");
reader.delete(new Term("word","keyword"));
reader.close();

하면 해당 텀을 가지는 모든 Document가 전부 삭제 된다.


Document 복구
IndexReader에 undeleteAll()은 삭제 표시를 제거하여 복구가 가능하다.
단, Document를 삭제 했던 동일한 IndexReader 인스턴스에서 실행해야 한다.

Document 갱신
갱신은 먼저 색인에서 제거 후 다시 추가하는 방법을 사용한다.
만약, 다수의 Document 갱신이 필요하다면 일괄 삭제 후 일괄 추가하는 방법을
사용하자. (속도면에서 이득)

Document와 Field에 가중치
Document setBoost(1.5f);
Field.setBoost(1.5f);

Document에 줄 수도 있고 Field 단위로 줄 수도 있다.