[java] 아파치 루신(Apache Lucene)을 활용한 검색 히스토리 기능 구현 방법

아파치 루신(Apache Lucene)은 자바 기반의 오픈 소스 검색 라이브러리로, 텍스트 데이터를 검색 및 인덱싱하기 위한 강력한 도구입니다. 이번 블로그에서는 아파치 루신을 활용하여 검색 히스토리 기능을 구현하는 방법에 대해 알아보겠습니다.

1. 아파치 루신 설치

아파치 루신을 사용하기 위해서는 먼저 아파치 루신을 설치해야 합니다. 아파치 루신은 공식 웹사이트에서 다운로드하여 설치할 수 있으며, Java 개발 환경이 사전에 설치되어 있어야 합니다.

2. 검색 히스토리 저장 및 검색

검색 히스토리 기능을 구현하기 위해서는 먼저 사용자의 검색 히스토리를 저장할 데이터베이스가 필요합니다. 다음은 검색 히스토리를 저장하기 위한 간단한 데이터베이스 테이블의 예입니다.

CREATE TABLE search_history (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id INT,
  keyword VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

위의 테이블은 search_history라는 이름으로 검색 히스토리를 저장하는 테이블입니다. 사용자 ID, 검색 키워드, 생성일시를 저장합니다. 이 테이블에 검색 히스토리를 저장하기 위한 코드는 아래와 같습니다.

try (Connection conn = dataSource.getConnection();
     PreparedStatement pstmt = conn.prepareStatement("INSERT INTO search_history (user_id, keyword) VALUES (?, ?)")) {
  pstmt.setInt(1, userId);
  pstmt.setString(2, keyword);
  pstmt.executeUpdate();
}

검색 히스토리를 저장한 후, 아파치 루신을 사용하여 저장된 검색 히스토리를 검색할 수 있습니다. 아파치 루신의 검색 기능을 사용하기 위해서는 인덱스를 생성해야 합니다. 다음은 검색 히스토리를 인덱싱하기 위한 간단한 예제 코드입니다.

try (Directory index = FSDirectory.open(Paths.get("search_index"))) {
  Analyzer analyzer = new StandardAnalyzer();
  IndexWriterConfig config = new IndexWriterConfig(analyzer);
  config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
  try (IndexWriter writer = new IndexWriter(index, config)) {
    try (Connection conn = dataSource.getConnection();
         PreparedStatement pstmt = conn.prepareStatement("SELECT keyword FROM search_history WHERE user_id = ?")) {
      pstmt.setInt(1, userId);
      try (ResultSet rs = pstmt.executeQuery()) {
        while (rs.next()) {
          Document doc = new Document();
          doc.add(new TextField("keyword", rs.getString("keyword"), Field.Store.YES));
          writer.addDocument(doc);
        }
      }
    }
  }
}

위의 코드는 search_history 테이블에서 검색 히스토리를 가져와 인덱싱하는 예제입니다. 여기서는 textField 타입의 필드를 사용하여 검색 히스토리를 저장하였습니다.

3. 검색 히스토리 조회

검색 히스토리를 저장하고 인덱싱했다면, 사용자가 검색 히스토리를 조회할 수 있어야 합니다. 아파치 루신을 이용하여 검색 히스토리 조회를 구현하는 예제 코드는 다음과 같습니다.

try (Directory index = FSDirectory.open(Paths.get("search_index"))) {
  IndexReader reader = DirectoryReader.open(index);
  IndexSearcher searcher = new IndexSearcher(reader);
  Analyzer analyzer = new StandardAnalyzer();
  QueryParser parser = new QueryParser("keyword", analyzer);
  Query query = parser.parse("user_id:" + userId);
  TopDocs results = searcher.search(query, 10);
  ScoreDoc[] hits = results.scoreDocs;
  for (ScoreDoc hit : hits) {
    Document doc = searcher.doc(hit.doc);
    System.out.println(doc.get("keyword"));
  }
}

위의 코드는 search_history 테이블에서 특정 사용자의 검색 히스토리를 조회하는 예제입니다. userId를 조건으로 검색을 수행하고, 조회된 검색 히스토리를 출력합니다.

결론

이번 블로그에서는 아파치 루신을 사용하여 검색 히스토리 기능을 구현하는 방법에 대해 알아보았습니다. 아파치 루신은 강력한 검색 엔진으로 다양한 검색 기능을 제공합니다. 검색 히스토리의 저장과 검색을 통해 사용자에게 좋은 검색 경험을 제공할 수 있습니다.

참고자료