본문 바로가기

Lucene

[lucene] 색인에서...Document와 Field의 추가

루씬에서는 하나의 색인에 여러개의 Document를 추가 할 수도 있고
하나의 Field에 여러개의 값을 색인 시킬 수도 있다.

다음의 경우를 보자..

org.apache.lucene.document.Document doc_lucene = null;
Field field = null;
IndexWriter indexWriter = new IndexWriter(...);

for(int i = 0; i < 10; i++) {
doc_lucene.addDocument(field =  new Field("id", "아이디"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));
doc_lucene.addDocument(field =  new Field("content", "내용"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));

writer.addDocument(doc_lucene);
}





이런경우에 루크나 이런걸로 색인을 열어보면
<id>,<content> 필드를 갖는 Document가 10개가 생성되어 있을 것이다.

아래의 경우를 보자..
org.apache.lucene.document.Document doc_lucene = null;
org.apache.lucene.document.Document doc_lucene2 = null;

Field field = null;
IndexWriter indexWriter = new IndexWriter(...);


for(int i = 0; i < 10; i++) {
doc_lucene.addDocument(field =  new Field("id", "아이디"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));
doc_lucene.addDocument(field =  new Field("content", "내용"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));

writer.addDocument(doc_lucene);
}

for(int i = 0; i < 10; i++) {
doc_lucene2 .addDocument(field =  new Field("id", "아이디"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));
doc_lucene2 .addDocument(field =  new Field("content", "내용"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));

writer.addDocument(doc_lucene2);
}

이 경우에 어떻게 될까..

색인에는 <id>와 <field>를 갖는 Document가 20개가 들어가있다.
서로 다른 Document를 생성해서 넣었다 하더라도, 하나의 색인에는 같은 필드를 가진
Document로서 들어가 있는 것이다.
(검색엔진의 색인은 DB의 PK같은 개념이 없다. 각 필드의 같은 값이 들어가 있더라도
그것들은 서로 다른 Document일 뿐이다.)


그렇다면 아래의 경우는 어떨까...

org.apache.lucene.document.Document doc_lucene = null;
org.apache.lucene.document.Document doc_lucene2 = null;

Field field = null;
IndexWriter indexWriter = new IndexWriter(...);


for(int i = 0; i < 10; i++) {
doc_lucene.addDocument(field =  new Field("id", "아이디"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));
doc_lucene.addDocument(field =  new Field("content", "내용"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));

writer.addDocument(doc_lucene);
}

for(int i = 0; i < 10; i++) {
doc_lucene2 .addDocument(field =  new Field("id"+"EXT", "아이디"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));
doc_lucene2 .addDocument(field =  new Field("content"+"EXT", "내용"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));

writer.addDocument(doc_lucene2);
}

<id>,<content>,<idEXT>,<contentEXT> 4개의 필드를 갖는
Document가 20개 생성된다.

물론 <id>,<content>에만 값이 들어가 있는 Document 10개
<idEXT>,<contentEXT>에만 값이 들어가 있는 Document 10개가 들어가 있다.

하나의 필드에 여러개의 값을 할당 할 수도 있다.

Field field = null;
IndexWriter indexWriter = new IndexWriter(...);


for(int i = 0; i < 10; i++) {
doc_lucene.addDocument(field =  new Field("id", "아이디"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));
doc_lucene.addDocument(field =  new Field("content", "내용"+i. Field.Store.YES , Field.Index.UN_TOKENIZED));
}

writer.addDocument(doc_lucene);

하나의 document 하나의 필드에 여러개의 값을 마구 넣고
색인을 할 경우...

루크등으로 열어보면

<id>~<id> (10개)
<content>~<content> (10개)
이렇게 필드를 가진 Document가 10개 생성된다.

이것은 나중에 동의어 추출등에서 유용하게 사용 할 수 있다.


ex>
for(int i = 0; i < hits.length(); i++) {
org.apache.lucene.document.Document doc = hits.doc(i);
String[] values = doc.getValues("id");

for(int j = 0; j < values.length; j++) {
    System.out.println("values : " + values);
}