루씬에서는 하나의 색인에 여러개의 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);
}