본문으로 바로가기
반응형

앞서서는 루씬의 index에 관련해서 알아봤습니다.

물론 앞선 예제에서 따라하기 형태의 index, search를 전부 경험해볼수 있으니, 기본적인 사용법은 예제와 같습니다.

(기본 따라하기 예제 - https://tourspace.tistory.com/237)


루씬에서 지원하는 검색은 질의(Query)와 문서간의 유사성을 판단합니다.

여기서 유사성은 Document에 질의한 term이 나오는 횟수로 결정되면 이 유사도로 scoring을 하고 해당 문서를 결과로 return 합니다.


검색 indexing처럼 크게 API 어렵거나 사용이 복잡하지 않습니다.

다만 검색에서 기본적으로 사용되는 class들에 대해서 간단하게 정리하고자 합니다.

이 글은 lucene v8.2.0 기준으로 작성되었습니다.

모든 예제코드는 Kotlin으로 작성되었습니다.

IndexReader

앞선 예제에서 indexReader는 DirectoryReader.open() 함수를 통해 얻을수 있습니다.
간단하죠?

indexReader는 생성 시점에 segment에서 index를 읽어snapshot을 가집니다
따라서 객체 생성후 index가 변경 되더라도 이전 정보를 기준으로 검색됩니다.

또한 indexReader는 Thread-Safe하기 때문에 여러 background에서 사용할 수 있습니다.
마지막으로 open()으로 indexReader를 생성하여 사용하고 나서는 closs()로 resource를 반납해야 합니다.

Closable interface를 상속받고 있기 때문에 java 1.7 이상이라면 try-catch-resources 구문을 이용할 수있고 kotlin이라면 use{...}를 사용하여 사용이 끝나 indexReader를 심플하게 close 할 수 있습니다.


IndexSearcher

indexReader를 통해서 색인에 접근합니다.
예제를 보면 indexSearch의 query() 함수로 검색을 요청합니다.
query로 다양한 조합들을 넣어 원하는 결과를 TopDocs로 받습니다.

예제에서는 주로 query와 반환개수에 대한 API를 사용했으나, 페이징이나 정렬시 아래와 같은 API를 사용하면 됩니다.
// n개의 결과 반환
val topDocs1 = searcher.search(query, 10);

// 정렬 또는 paging이 필요할때
val scoredDocs = topDocs1.scoreDocs
val topDocs2 = searcher.searchAfter(scoredDocs, query, 10, Sort(SortField("contents", SortFiled.Type.STRING),


추가적으로 setSimilarity() 함수로 유사도를 설정하거나, explain() 함수로 document 점수를 계산할 수 도 있습니다.


반응형