[Python] 검색엔진 Whoosh Develop Tip

2000년 이전만 하더라도 별도의 전문(Full-Text) 검색엔진이 별로 없었습니다.
Google, Yahoo, Altavista 등의 포털에서 개별 검색엔진을 만들어 이용하고는 하였고
그것을 라이브러리 형태로 제공해 주는 것은 그렇게 많지 않았습니다.
그것이 범용 시스템에서 여러가지 전문 검색용 라이브러리로 이용되기 시작한 것은
아마도 Lucene가 본격적으로 이용되지 않았을까 싶습니다.

이 루씬을 만든 사람은 Java를 처음 배워서 만든 엔진이고,
그 이후에는 Hadoop의 태생으로 까지 이어졌다고 합니다.

하지만 최근 전까지만 하더라도 파이썬에서는 별도의 검색엔진
라이브러리가 없어 루씬 엔진에 인터페이스를 한 pyLucene 이라는 것을
이용하고는 했습니다.

그러다가 비교적 최근에 나온 파이썬 검색엔진 라이브러리로
Whoosh 라는 것을 찾게 되었습니다.

2009년도 부터 시작은 되었던 것 같고, 최근 2.6 버전까지 나왔는데,
파이썬에서만 이용한다는 관점에서는 루씬과 별반 차이없이
깔끔하게 이용할 수 있다고 합니다. (일부 벤치마크에서는 루씬보다 더 좋다고 하네요)

암튼 별도의 한글 형태소 분석기 없이도,
N-Gram 방식으로 한글도 비교적 잘 검색할 수 있는 방법이 
존재하였습니다.

다음은 그 소개 입니다.

#coding=utf-8
# 아래와 같은 모듈을 import 합니다
import os
from whoosh.index import create_in
from whoosh.fields import *
# indexdir을 색인 폴더로 이용해 봅니다
indexdir = '/tmp/whoosh_ndx'
if not os.path.exists(indexdir): os.makedirs(indexdir)
# SQL의 DDL을 이용하듯이 특정 문서의 Schema 설정을 우선 합니다.
schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT,
tags=NGRAMWORDS(stored=True))
# 스키마 정보로 색인용 폴더를 생성합니다.
ix = create_in(indexdir, schema)
# Inverted색인을 위한 writer를 정의합니다.
writer = ix.writer()
# 다음과 같이 문서를 추가합니다.
writer.add_document(title=u"First document", path=u"/a",
                    content=u"This is the first document we've added!",
                    tags=u"우리는 민족중흥의 역사적 사명을 띄고")
writer.add_document(title=u"Second document", path=u"/b",
                    content=u"The second one is even more interesting!",
                    tags=u"이땅에 태어났다. 이에 우리는")
writer.commit()
# 문서 추가를 마친 후 commit을 합니다. with 컨텍스트 사용도 가능합니다.
# Query를 위한 Parser 모듈을 가져옵니다.
from whoosh.qparser import QueryParser
# 색인이 searcher 컨텍스를 이용합니다.
with ix.searcher() as searcher:
# N-Gram 단어라 "사명을..." 에서 "명을"을 입력해도 찾아옵니다. 
query = QueryParser("tags", ix.schema).parse(u"명을")
results = searcher.search(query)
for r in results:
print r

위에서 NGRAM 이란,
"가나다라" 라는 단어가 있을 경우,
2-그램의 "가나", "나다", "다라" 혹은, 
3-그램의 "가나다",  "나다라" 로 검색이 모두 가능하다는 것입니다.
작은 그램으로 나누면 나눌 수록 색인의 양은 많아지지만
특정 언어에 상관없이 가급적 많은 결과를 찾아올 수 있습니다.

NGRAMWORD는 일단 공백 등으로 단어를 나누고 그 단어를 NGRAM으로
색인하는 것을 의미합니다.


어느분께는 도움이 되셨기를... 

핑백

  • 지훈현서 : [Python] Whoosh 검색 엔진을 이용하여 CVE 검색하기 2017-01-24 22:05:06 #

    ... 해당 내용 (body)입니다. 그런데 문제는 body 부분이 일반 영문 설명이기 때문에 이것을 검색하는 것은검색엔진을 이용해야 합니다. 전에 [Python] 검색엔진 Whoosh를 확인해 본 적이 있는데, 이를 활용해 보겠습니다. 우선 index.py 를 이용하여 "http://cve.mitre.org/data/ ... more

덧글

댓글 입력 영역

구글애드텍스트