[java] 아파치 루신(Apache Lucene)을 이용한 동의어 처리 및 확장 방법

아파치 루신은 검색 엔진을 구축하는 데 사용되는 오픈 소스 라이브러리입니다. 이 라이브러리는 빠른 검색과 강력한 텍스트 분석 기능을 제공하며, 다양한 확장 기능을 지원합니다. 이 중에서도 동의어 처리와 확장 기능에 대해 알아보겠습니다.

동의어 처리

검색 시 사용자가 입력한 키워드와 동의어를 모두 고려하고 싶을 때, 아파치 루신은 SynonymFilter를 사용하여 동의어 처리를 지원합니다. SynonymFilter는 분석기 체인에 추가하여 검색어에 대한 동의어를 자동으로 적용합니다.

Analyzer analyzer = new StandardAnalyzer();
SynonymMap.Builder builder = new SynonymMap.Builder(true);
builder.add(new CharsRef("lucene"), new CharsRef("search"));
SynonymMap synonymMap = builder.build();
SynonymGraphFilter synonymFilter = new SynonymGraphFilter(new GraphTokenFilter(new WhitespaceTokenizer()), synonymMap, true);
TokenStream finalTokenStream = synonymFilter;
finalTokenStream = new LowerCaseFilter(finalTokenStream);
finalTokenStream = new StopFilter(finalTokenStream, StandardAnalyzer.STOP_WORDS_SET);
TokenStreamComponents tokenStreamComponents = new TokenStreamComponents(new WhitespaceTokenizer(), finalTokenStream);
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
indexWriterConfig.setRAMBufferSizeMB(256.0);
indexWriterConfig.setCodec(new Lucene50Codec());
IndexWriter indexWriter = new IndexWriter(indexDir, indexWriterConfig);
...

위의 예시 코드에서는 “lucene”와 “search”를 동의어로 처리하고자 합니다. 이를 위해 SynonymMap.Builder를 사용하여 동의어 맵을 생성하고, SynonymGraphFilter를 사용하여 동의어를 적용합니다. 최종적으로 TokenStreamComponents를 이용하여 검색어를 처리합니다.

확장 기능

검색 엔진에 새로운 동의어를 추가하고 싶을 때, 아파치 루신은 SynonymMap.Builder를 사용하여 동의어 맵을 동적으로 수정할 수 있습니다. 다음은 동적으로 동의어를 추가하는 예시 코드입니다.

Analyzer analyzer = new StandardAnalyzer();
IndexReader indexReader = DirectoryReader.open(indexDir);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
SynonymMap currentSynonymMap = new SynonymMap(new HashMap<>(), true);
SynonymMap.Builder builder = new SynonymMap.Builder(currentSynonymMap);
builder.add(new CharsRef("search"), new CharsRef("retrieve"));
builder.add(new CharsRef("search"), new CharsRef("query"));
SynonymMap newSynonymMap = builder.build();
TokenStream tokenStream = analyzer.tokenStream(fieldName, new StringReader(query));
tokenStream = new SynonymGraphFilter(tokenStream, newSynonymMap, true);
...

위의 예시 코드에서는 “search”와 “retrieve”, “search”와 “query”를 동의어로 추가하고자 합니다. 이를 위해 현재의 동의어 맵을 가져오고, SynonymMap.Builder를 사용하여 동의어를 추가하고 새로운 동의어 맵을 생성합니다. 새로운 동의어 맵을 사용하여 TokenStream을 처리하면 새로 추가된 동의어가 적용됩니다.

결론

아파치 루신을 이용하여 동의어 처리와 확장 기능을 적용할 수 있습니다. 동의어 처리를 통해 검색 결과의 다양성을 높이고, 동적으로 동의어를 추가하여 검색 엔진의 정확도를 향상시킬 수 있습니다. 이러한 기능들을 활용하여 사용자에게 더욱 효과적인 검색 결과를 제공할 수 있습니다.


참고 문서: