>  기사  >  백엔드 개발  >  Whoosh: Python용 경량 검색 도구

Whoosh: Python용 경량 검색 도구

PHPz
PHPz앞으로
2023-04-14 21:07:011557검색

Whoosh: Python용 경량 검색 도구

Whoosh 소개

Whoosh는 Matt Chaput에 의해 만들어졌습니다. Houdini 3D 애니메이션 소프트웨어 패키지의 온라인 문서를 위한 간단하고 빠른 검색 서비스 도구로 시작하여 점차 성숙한 검색 솔루션 도구가 되었습니다. 오픈 소스.

Whoosh는 순수하게 Python으로 작성되었으며 유연하고 편리하며 가벼운 검색 엔진 도구입니다. 이제 Python2와 3을 모두 지원합니다. 장점은 다음과 같습니다.

  • Whoosh는 순수하게 Python으로 작성되었지만 매우 빠릅니다. , Python 환경만 필요하며 컴파일러는 필요하지 않습니다.
  • Okapi BM25F 정렬 알고리즘은 기본적으로 사용되며 다른 정렬 알고리즘도 지원됩니다.
  • Whoosh는 더 작은 인덱스 파일을 생성합니다. 인코딩은 유니코드여야 합니다.
  • Whoosh는 모든 Python 개체를 저장할 수 있습니다.
  • Whoosh 공식 소개 사이트는 https://whoosh.readthedocs.io/en/latest/intro.html 입니다. ElasticSearch 또는 Solr와 같은 성숙한 검색 엔진 도구에 비해 Whoosh는 더 가볍고 작동이 간단하며 소규모 검색 프로젝트에 사용하는 것을 고려할 수 있습니다.

Index & query

ES에 익숙한 분들이라면 검색의 두 가지 중요한 측면은 매핑과 쿼리, 즉 인덱스 구성과 쿼리이며, 그 뒤에는 복잡한 인덱스 저장, 쿼리 구문 분석 및 정렬 알고리즘이 있습니다. ES 경험이 있다면 Whoosh를 시작하는 것은 매우 쉽습니다.

작성자의 이해와 Whoosh의 공식 문서에 따르면 Whoosh의 입문 용도는 주로 색인과 쿼리입니다. 검색 엔진의 강력한 기능 중 하나는 BM25와 같은 정렬 알고리즘과 필드 저장 방법에 따라 전체 텍스트 검색을 제공하는 기능입니다. 따라서 index가 명사로 사용되는 경우에는 해당 필드의 인덱스를 의미하고, 동사로 사용되는 경우에는 해당 필드의 인덱스를 설정하는 것을 의미합니다. 쿼리는 정렬 알고리즘을 사용하여 쿼리해야 하는 명령문을 기반으로 합리적인 검색 결과를 제공합니다.

Whoosh 사용과 관련하여 공식 문서에 자세한 지침이 제공되어 있습니다. 여기에서는 Whoosh가 검색 경험을 쉽게 개선할 수 있는 방법을 설명하기 위해 간단한 예만 제공합니다.

예제 코드

Data

이 프로젝트의 예제 데이터는 poem.csv입니다. 다음 그림은 데이터 세트의 처음 10개 행입니다.

Whoosh: Python용 경량 검색 도구poem.csv

Fields

데이터 세트에서 제목, 왕조, 시인, 내용의 네 가지 필드를 만듭니다. 생성된 코드는 다음과 같습니다.

# -*- coding: utf-8 -*-
import os
from whoosh.index import create_in
from whoosh.fields import *
from jieba.analyse import ChineseAnalyzer
import json
# 创建schema, stored为True表示能够被检索
schema = Schema(title=TEXT(stored=True, analyzer=ChineseAnalyzer()),
 dynasty=ID(stored=True),
 poet=ID(stored=True),
 content=TEXT(stored=True, analyzer=ChineseAnalyzer())
 )

그 중 ID는 단위 값만 가능하며 여러 단어로 나눌 수 없습니다. 파일 경로, URL, 날짜 및 분류에 자주 사용됩니다. 텍스트의 색인을 설정하고 저장하며, 단어 검색을 지원합니다. 분석기는 말더듬이 있는 중국어 단어 분할기를 선택합니다.

인덱스 파일 만들기

다음으로 인덱스 파일을 만들어야 합니다. 프로그램을 사용하여 먼저 poem.csv 파일을 구문 분석하고 이를 인덱스로 변환한 후 indexdir 디렉터리에 씁니다. Python 코드는 다음과 같습니다.

# 解析poem.csv文件
with open('poem.csv', 'r', encoding='utf-8') as f:
 texts = [_.strip().split(',') for _ in f.readlines() if len(_.strip().split(',')) == 4]
# 存储schema信息至indexdir目录
indexdir = 'indexdir/'
if not os.path.exists(indexdir):
 os.mkdir(indexdir)
ix = create_in(indexdir, schema)
# 按照schema定义信息,增加需要建立索引的文档
writer = ix.writer()
for i in range(1, len(texts)):
 title, dynasty, poet, content = texts[i]
 writer.add_document(title=title, dynasty=dynasty, poet=poet, content=content)
writer.commit()

색인이 성공적으로 생성되면 위의 poem.csv 데이터의 각 필드에 대한 색인 파일이 포함된 indexdir 디렉터리가 생성됩니다.

Query

인덱스가 성공적으로 생성된 후 이를 쿼리에 사용합니다.

예를 들어 콘텐츠에 밝은 달이 포함된 시를 쿼리하려면 다음 코드를 입력하면 됩니다.

# 创建一个检索器
searcher = ix.searcher()
# 检索content中出现'明月'的文档
results = searcher.find("content", "明月")
print('一共发现%d份文档。' % len(results))
for i in range(min(10, len(results))):
 print(json.dumps(results[i].fields(), ensure_ascii=False))

출력 결과는 다음과 같습니다.

一共发现44份文档。
前10份文档如下:
{"content": "床前明月光,疑是地上霜。举头望明月,低头思故乡。", "dynasty": "唐代", "poet": "李白 ", "title": "静夜思"}
{"content": "边草,边草,边草尽来兵老。山南山北雪晴,千里万里月明。明月,明月,胡笳一声愁绝。", "dynasty": "唐代", "poet": "戴叔伦 ", "title": "调笑令·边草"}
{"content": "独坐幽篁里,弹琴复长啸。深林人不知,明月来相照。", "dynasty": "唐代", "poet": "王维 ", "title": "竹里馆"}
{"content": "汉江明月照归人,万里秋风一叶身。休把客衣轻浣濯,此中犹有帝京尘。", "dynasty": "明代", "poet": "边贡 ", "title": "重赠吴国宾"}
{"content": "秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。", "dynasty": "唐代", "poet": "王昌龄 ", "title": "出塞二首·其一"}
{"content": "京口瓜洲一水间,钟山只隔数重山。春风又绿江南岸,明月何时照我还?", "dynasty": "宋代", "poet": "王安石 ", "title": "泊船瓜洲"}
{"content": "四顾山光接水光,凭栏十里芰荷香。清风明月无人管,并作南楼一味凉。", "dynasty": "宋代", "poet": "黄庭坚 ", "title": "鄂州南楼书事"}
{"content": "青山隐隐水迢迢,秋尽江南草未凋。二十四桥明月夜,玉人何处教吹箫?", "dynasty": "唐代", "poet": "杜牧 ", "title": "寄扬州韩绰判官"}
{"content": "露气寒光集,微阳下楚丘。猿啼洞庭树,人在木兰舟。广泽生明月,苍山夹乱流。云中君不见,竟夕自悲秋。", "dynasty": "唐代", "poet": "马戴 ", "title": "楚江怀古三首·其一"}
{"content": "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,

위 내용은 Whoosh: Python용 경량 검색 도구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제