1편에서는 Field, Document, Analyzer, Directory 등 개념을 알아봤습니다.
인덱싱 편에서는 lucene에서 제공하는 인터페이스가 직관적이라 코드를 보면서 이해하는 게 좋습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Directory directory = new RAMDirectory();
Analyzer analyzer = new SimpleAnalyzer(); //SimpleAnalyzer를 통해서 인덱싱을 진행합니다.
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
IndexWriter writer = new IndexWriter(directory, config); //writer를 통해서 doc를 넣습니다.
Document doc = new Document();
doc.add (new Field("Title" , "The last leaf" ,Field.Store.YES, Field.Index.ANALYZED));
doc.add (new Field("Author" , "O Henry" ,Field.Store.YES, Field.Index.ANALYZED));
doc.add (new Field("Summary" , "Johnsy, a poor young woman who is seriously ill with pneumonia.
She believes that when the ivy vine on the wall outside her window loses all its leaves,
she will also die. " ,Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
doc = new Document();
doc.add (new Field("Title" , "What Men Live By" ,Field.Store.YES, Field.Index.ANALYZED));
doc.add (new Field("Author" , "Leo Tolstoy" ,Field.Store.YES, Field.Index.ANALYZED));
doc.add (new Field("Summary" , "Leo Tolstoy Simon was a poor shoemaker who did not have
house or land of his own. He used to stay in a peasant's house and earned his living
by work to feed his wife and children." ,Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
writer.close();
cs
cs
위에 코드 이해를 돕기 위해 Document를 구성하는 Field에 대해서 알아볼게요.
Field
Field 는 Document 의 Description 을 저장합니다. 위에 코드에서는 "Title", "Author", "Summary"라는 3개의 필드가 있습니다.
매 번 writer를 통해 doc를 추가할 때마다 Field를 채워넣는 걸 확인할 수 있습니다.
하지만 Field 명과 Field 값말고도 Store.Yes, Field.Index.ANALYZED와 같은 파라미터가 있는 걸 볼 수 있는데요.
이거는 색인 옵션, 저장 옵션이라고 합니다. 간단히 정리하자면 아래와 같습니다.
Field 의 색인 옵션 :
Index.ANALYZED: 해당 필드 값을 분석한다 . ex) 제목 , 내용 ,
Index.NOT_ANALYZED: 해당 필드 값을 분석하지 않는다 . 완전 일치해야한다 . ex) 전화번호 , 이메일주소 ,
Index.NO: 해당 Field 값은 인덱싱되지 않는다 .
Field 의 저장 옵션 :
Store.YES: Field 값을 온전히 다 저장한다 .
Store.NO: Field 값을 간추려서 저장한다 . ( 복원 불가능 ) 해당 Field 값이 클 경우 쓰임 .
그리고 참고로 여러 값을 가진 Field는 아래와 같이 코딩하시면 됩니다.
//마치 작가처럼 여러 작가들이 한 문서에 있을 수 있죠 .
Document doc = new Document();
for (String author : authors) {
doc.add (new Field("author" , author, Field.Store.YES,
Field.Index.ANALYZED));
}
cs
이제 directory에 원하는 doc들을 추가시킬 수 있습니다. 이 정도만 아셔도 lucene의 인덱싱 과정의 기본은 끝냈다고 할 수 있습니다.
FSDirectory를 이용해서 directory를 로컬에 저장하거나 커스텀 인덱싱에 대해서는 나중에 심화편에서 다루도록 하겠습니다.
만약 Weight 수정에 대해서 알고 싶은 분은 아래 더보기를 클릭해주세요.
더보기 접기
Weight 수정
그래도 사족으로 Weight를 수정하는 법에 대해서 간단히 정리할게요.
Document의 여러 필드가 굳이 같은 Weight를 가지라는 법은 없습니다. 예를 들어 저희가 구글에서 검색을 할 때, 같은 단어일 경우 제목에 해당 단어가 있는 게 내용에 있는 것보다 눈이 가는 것처럼 말이죠. 그러므로 Field 의 Weight값을 넣는 것은 상당히 중요합니다.
문서에 웨이트 넣기 :
Document doc = new Document();
…
if (A)
doc.setBoost(1. 5F);
else
doc.setBoost(0. 1F);
cs
같은 형식으로 웨이트를 다르게 할 수 있다 .
Field 에 웨이트 넣기 :
Field subjectField = new Field("subject" , subject,
Field.Store.YES,
Field.Index.ANALYZED);
subjectField.setBoost(1. 2F);
cs
같은 형식으로 Field 에서 웨이트를 수정할 수 있다 .
접기
사진 출저 및 참고:
https://www.cnblogs.com/skyme/archive/2012/07/30/2615054.html