>  기사  >  백엔드 개발  >  Python과 Xapian을 사용하여 고속 검색 엔진 구축

Python과 Xapian을 사용하여 고속 검색 엔진 구축

高洛峰
高洛峰원래의
2016-10-18 10:03:171186검색

먼저 몇 가지 개념을 이해하세요. 문서, 용어, 게시 정보 검색(IR)에서 얻으려는 항목을 "문서"라고 하며, 각 문서는 일련의 용어로 설명됩니다. "문서"와 "용어"라는 두 단어는 IR 용어로 "라이브러리 관리"에서 유래되었습니다. 일반적으로 문서는 기계가 읽을 수 있는 형식의 텍스트로 간주되며, 용어는 일반적으로 문서에서 문서를 설명하는 데 사용되는 단어나 문구입니다. 문서가 구강_위생_과 관련된 경우 "치아", "치아", "칫솔", "부패", "충치", "플라크" 또는 "다이어트" 등의 용어가 존재할 수 있습니다.

IR 시스템에 D라는 문서가 있고 이 문서를 t라는 용어로 설명하면 t는 인덱스 D로 간주되며 이는 다음 공식으로 표현됩니다. t- > 디. 실제 응용에서 IR 시스템은 일반적으로 D1, D2, D3...와 같은 여러 문서의 모음과 t1, t2, t3...과 같은 여러 용어의 모음이므로 다음과 같습니다. 관계: ti -> Dj.

특정 용어가 특정 문서를 색인화하는 경우를 게시라고 합니다. 직설적으로 말하면 게시는 관련성 검색에 특정 용도로 사용될 수 있는 위치 정보가 포함된 용어입니다.

D라는 문서가 주어지면 이를 색인화하는 용어 목록이 있는데, 이를 D의 용어 목록이라고 합니다.

t라는 용어가 주어지면 t의 게시 목록이라고 하는 문서 목록을 색인화합니다("문서 목록"을 사용하는 것이 이름 지정에 있어 더 일관적일 수 있지만 너무 모호하게 들립니다).

컴퓨터에 존재하는 IR 시스템에서는 용어가 색인 파일에 저장됩니다. 용어를 사용하면 게시 목록을 효과적으로 검색할 수 있습니다. 게시 목록에서 각 문서에는 문서 ID라는 짧은 식별자가 있습니다. 간단히 말해서 게시 목록은 문서 ID 모음으로 생각할 수 있는 반면 용어 목록은 문자열 모음으로 생각할 수 있습니다. 일부 IR 시스템에서는 내부적으로 용어를 나타내기 위해 숫자를 사용하므로 Xapian에서는 용어 목록이 숫자의 모음이 아닙니다. 공간을 압축하기 위해 접두사를 사용합니다.

용어는 반드시 문서에 나오는 단어일 필요는 없으며, 대개 소문자로 변환되고 형태소 분석 알고리즘에 의해 처리되는 경우가 많기 때문에 " 값을 갖는 용어를 통해 검색할 수 있습니다. 연결" "연결", "연결", "연결" 또는 "연결됨" 등과 같은 일련의 단어로, 하나의 단어가 여러 용어를 생성할 수도 있습니다. 예를 들어 추출된 어간과 추출되지 않은 어간을 모두 색인화합니다. 말. 일어서라. 물론 이는 영어, 프랑스어, 라틴어 등 유럽 및 미국 언어에만 적용될 수 있지만, 중국어 분사는 일반적으로 중국어 분사와 다음과 같은 차이점이 있습니다. 🎜 >

l. 영어를 예로 들면, 일반적으로 영어의 각 단어는 공백으로 구분되지만, 중국어의 경우에는 전체에 공백이나 구두점이 없을 정도로 극단적일 수도 있습니다. 기사. 2. 위에서 언급한 바와 같이 "connect", "connects", "connection" 또는 "connected"는 각각 "동사 성격의 연결", "3인칭 동사 성격의 연결", "명칭 성격의 연결" 또는 "과거형"을 의미합니다. of connect'라고 하지만 중국어에서는 'connection'으로 모든 것을 표현할 수 있어 어간법이 거의 필요하지 않습니다. 이는 영어의 다양한 품사의 대부분이 규칙 기반인 반면, 중국어 품사는 거칠고 제약이 없다는 것을 의미합니다. 3. 두 번째 점은 중국어 단어 분할의 어려움을 축소한 것입니다. 예를 들어 "중화인민공화국이 건국되었습니다"라는 문장에서 문장의 의미를 완전하고 정확하게 식별하는 것은 매우 어렵습니다. "중국"과 "중국어", "인민", "공화국", "창건" 및 기타 단어로 구별할 수 있지만 그 중 "중국어"는 실제로 이 문장과 관련이 거의 없습니다. 언뜻 보면 간단해 보이지만, 기계가 그 비밀을 이해하는 것은 왜 그렇게 쉬운 걸까요?

값은 문서에 첨부되는 일종의 메타데이터입니다. 각 문서는 여러 값을 가질 수 있으며 이러한 값은 서로 다른 숫자로 식별됩니다. 값은 일치 프로세스 중에 빠르게 액세스할 수 있도록 설계되었으며, 중복 문서 정렬, 큐잉, 범위 검색 등의 목적으로 사용될 수 있습니다. 값의 길이 제한은 없지만 가능한 한 짧게 유지하는 것이 가장 좋습니다. 결과로 표시할 필드만 저장하려는 경우 문서의 데이터에 저장하는 것이 좋습니다.

문서 데이터

각 문서에는 하나의 데이터만 있으며, 어떤 형식의 데이터라도 가능합니다. 물론 저장할 때 먼저 문자열로 변환하세요. 조금 이상하게 들릴 수도 있지만 현실은 다음과 같습니다. 저장할 데이터가 텍스트 형식인 경우 직접 저장할 수 있습니다. 저장할 데이터가 다양한 개체인 경우 먼저 바이너리 스트림으로 직렬화한 다음 저장한 다음 역직렬화하여 읽을 때 읽으세요.

포스팅

포스팅은 위치가 있는 용어입니다.

# -*- coding: gb18030 -*-
import xapian
testdatas = [u'abc test python1',u'abcd testing python2']
def buildtest():
    database = xapian.WritableDatabase('indexes/', xapian.DB_CREATE_OR_OPEN)
    stemmer = xapian.Stem("english")
    for data in testdatas:
        doc = xapian.Document()
        doc.set_data(data)
        for term in data.split():
            doc.add_term(term)
        database.add_document(doc)
if __name__ == '__main__':
    buildtest()
이 실행된 후 현재 디렉터리에 인덱스 라이브러리가 생성됩니다.


[sh]

[ec2-user@ip-10-167-6-221 indexes]$ ll

총 사용량 52

-rw-rw-r-- 1 ec2-user ec2-user 0 7월 28일 16:06 flintlock

-rw-rw-r-- 1 ec2-user ec2-user 28 7월 28일 16 :06 iamchert

-rw-rw-r-- 1 ec2-user ec2-user 13 7월 28일 16:06 postlist.baseA

-rw-rw-r-- 1 ec2- 사용자 ec2-user 14 7월 28일 16:06 postlist.baseB

-rw-rw-r-- 1 ec2-user ec2-user 8192 7월 28일 16:06 postlist.DB

- rw-rw-r-- 1 ec2-user ec2-user 13 7월 28일 16:06 Record.baseA

-rw-rw-r-- 1 ec2-user ec2-user 14 7월 28일 16:06 Record.baseB

-rw-rw-r-- 1 ec2-user ec2-user 8192 7월 28일 16:06 Record.DB

-rw- rw-r-- 1 ec2- 사용자 ec2-user 13 7월 28일 16:06 termlist.baseA

-rw-rw-r-- 1 ec2-user ec2-user 14 7월 28일 16:06 termlist.baseB

- rw-rw-r-- 1 ec2-user ec2-user 8192 July 28 16:06 termlist.DB

다음 글에서 인덱스를 쿼리하는 방법을 소개하겠습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.