파이썬으로 PyLucene을 활용한 검색 인덱스 구축하기

목차

1. PyLucene이란

PyLucene은 자바의 Lucene 검색 라이브러리를 파이썬에서 사용할 수 있도록 한 패키지입니다. Lucene은 텍스트 기반의 검색 엔진으로, 효율적인 텍스트 검색을 제공합니다. PyLucene을 사용하면 파이썬 개발자들도 Lucene의 강력한 검색 기능을 활용할 수 있습니다.

2. 검색 인덱스란

검색 인덱스는 데이터를 효율적으로 검색하고 탐색하기 위해 구성된 데이터 구조입니다. Lucene을 사용하여 검색 인덱스를 구축하면 텍스트 문서의 내용을 색인화하여 빠르게 검색할 수 있습니다. 이를 통해 대용량의 데이터를 효율적으로 처리할 수 있습니다.

3. PyLucene 설치

PyLucene은 자바와 파이썬을 함께 사용하는 패키지이므로, 우선 자바를 설치해야 합니다. 자바를 설치한 후, 파이썬 가상환경을 생성하고 PyLucene을 설치할 수 있습니다.

# 자바 설치
sudo apt-get install openjdk-11-jdk

# 파이썬 가상환경 생성
python3 -m venv myenv
source myenv/bin/activate

# PyLucene 설치
pip install PyLucene

4. 검색 인덱스 구축하기

다음은 PyLucene을 사용하여 검색 인덱스를 구축하는 예제 코드입니다. 예제 코드에서는 “data” 폴더에 있는 텍스트 문서들을 인덱싱하고 검색 인덱스를 생성합니다.

import lucene
from lucene import \
    SimpleFSDirectory, System, File, \
    Document, Field, StandardAnalyzer, IndexWriter, Version

lucene.initVM(vmargs=['-Djava.awt.headless=true'])

indexDir = "index"
dataDir = "data"

# 인덱스 디렉토리 생성
directory = SimpleFSDirectory(File(indexDir))

# 인덱스 작성을 위한 설정
analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)
indexWriter = IndexWriter(directory, analyzer, True, IndexWriter.MaxFieldLength.LIMITED)

for root, dirs, files in os.walk(dataDir):
    for file in files:
        if file.endswith('.txt'):
            path = os.path.join(root, file)
            file = open(path, "r")
            contents = file.read()
            file.close()
            
            # 문서 생성
            doc = Document()
            doc.add(Field("path", path, Field.Store.YES, Field.Index.NOT_ANALYZED))
            doc.add(Field("contents", contents, Field.Store.YES, Field.Index.ANALYZED))
            
            indexWriter.addDocument(doc)

# 작성된 인덱스 저장
indexWriter.optimize()
indexWriter.close()

5. 검색 쿼리 실행하기

검색 쿼리를 실행하는 예제 코드입니다. 예제 코드에서는 사용자로부터 검색어를 입력 받아 해당 검색어를 포함하는 문서를 검색하여 결과를 출력합니다.

import lucene
from lucene import \
    SimpleFSDirectory, System, File, \
    Document, Field, StandardAnalyzer, IndexSearcher, Version, QueryParser

lucene.initVM(vmargs=['-Djava.awt.headless=true'])

indexDir = "index"

# 인덱스 디렉토리 열기
directory = SimpleFSDirectory(File(indexDir))

# 검색 인덱스 검색기 생성
searcher = IndexSearcher(directory)

# 검색어 입력 받기
query = input("Enter query: ")

# QueryParser를 사용하여 검색 쿼리 생성
analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)
parser = QueryParser(Version.LUCENE_CURRENT, "contents", analyzer)
searchQuery = parser.parse(query)

# 검색 실행
hits = searcher.search(searchQuery, 10)

# 검색 결과 출력
for hit in hits.scoreDocs:
    doc = searcher.doc(hit.doc)
    print("Path:", doc.get("path"))
    print("Score:", hit.score)
    print()

# 검색 결과 닫기
searcher.close()

6. 참고 자료