Python轻量级搜索工具Whoosh的使用教程

Python轻量级搜索工具Whoosh的使用教程

什么是Whoosh?

Whoosh是一个基于Python语言开发的轻量级全文搜索引擎库。它提供了一个简单易用的API,使得在Python应用中集成全文搜索变得非常容易。Whoosh可以处理几乎任何类型的文本数据,包括HTML、XML、PDF等格式的文档。

安装Whoosh

在Python中使用pip命令安装Whoosh:

pip install whoosh

创建索引

在使用Whoosh进行搜索之前,首先需要创建索引。索引是一个包含搜索文档的数据结构,它用于加速搜索和排序操作。

以下是创建索引的基本步骤:

1.定义schema

schema用于定义索引包含文档的基本信息,包括文档的字段、字段类型等。定义完成后,可以使用schema创建索引。

from whoosh.fields import Schema, ID, TEXT

# 定义schema
schema = Schema(id=ID(stored=True),
                title=TEXT(stored=True),
                content=TEXT(stored=True))

2.创建索引

使用Schema来创建一个新索引。如果索引目录已经存在,则会打开现有的索引。索引目录是索引存放的文件夹路径。

from whoosh.index import create_in

# 创建一个新的索引
index_dir = 'indexdir'
if not os.path.exists(index_dir):
    os.mkdir(index_dir)

ix = create_in(index_dir, schema)

3.写入文档

创建完成索引后,可以向其中写入文档。文档是一个字典对象,包含了schema定义的字段。

from whoosh.index import open_dir
from whoosh import index

index_dir = 'indexdir'

# 打开索引
ix = open_dir(index_dir)

# 获取writer
writer = ix.writer()

# 写入文档
doc = {'id': u'001', 'title': u'Python搜索引擎', 'content': u'基于Python语言开发的全文搜索引擎库'}
writer.add_document(**doc)

# 提交文档
writer.commit()

进行搜索

完成创建索引操作后,就可以使用Whoosh进行搜索了。以下是搜索的基本步骤:

1.创建查询parser

parser用于将输入的查询语句转换为query对象,query对象可以用于在索引中搜索。

from whoosh.qparser import QueryParser

# 创建查询parser
qp = QueryParser("content", schema=schema)

2.解析查询语句

使用parser将输入的搜索语句转换为query对象。

from whoosh.query import *

# 解析查询语句
q = qp.parse(u"全文搜索引擎库")

3.执行查询

使用解析后的query对象来执行查询,即在索引中搜索与query对象匹配的文档。

from whoosh.searching import Searcher

# 打开索引
ix = open_dir(index_dir)

# 获取Searcher
searcher = ix.searcher()

# 执行查询
results = searcher.search(q)

# 显示查询结果
for hit in results:
    print(hit['title'], hit['content'])

示例

下面是两个使用Whoosh进行搜索的示例。

示例1

在以下的例子中,我们将编写一个简单的Python脚本,来搜索我们的文档。我们对schema和文档内容进行修改,包括增加了一个类型为DATETIME的字段,用于存储文档的日期。

from whoosh.fields import Schema, ID, TEXT, DATETIME
from whoosh.index import create_in
from datetime import datetime

# 定义schema
schema = Schema(id=ID(stored=True),
                title=TEXT(stored=True),
                content=TEXT(stored=True),
                date=DATETIME(stored=True))

# 创建索引
index_dir = 'indexdir'
if not os.path.exists(index_dir):
    os.mkdir(index_dir)

ix = create_in(index_dir, schema)

# 写入文档
with ix.writer() as writer:
    writer.add_document(id=u"001", 
                        title=u"Python搜索引擎", 
                        content=u"基于Python语言开发的全文搜索引擎库",
                        date=datetime(2022, 3, 1))

# 创建查询parser
qp = QueryParser("content", schema=schema)

# 解析查询语句
q = qp.parse(u"全文搜索引擎库")

# 执行查询
with ix.searcher() as searcher:
    results = searcher.search(q)

    # 显示查询结果
    for hit in results:
        print("%s, %s, %s" % (hit['title'], hit['content'], hit['date'].strftime("%Y-%m-%d")))

结果将输出以下内容:

Python搜索引擎, 基于Python语言开发的全文搜索引擎库, 2022-03-01

示例2

在以下的例子中,我们将使用Whoosh搜索本地磁盘上的PDF文件。我们将schema中增加一个属性来存储文件路径,并将PDF文件的信息写入索引。

from whoosh.fields import Schema, ID, TEXT, STORED
from whoosh.index import create_in
from whoosh.qparser import QueryParser
from whoosh.filedb.filestore import FileStorage
from whoosh import index

# 定义schema
schema = Schema(id=ID(stored=True),
                title=TEXT(stored=True),
                path=STORED,
                content=TEXT(stored=True))

# 创建索引
index_dir = 'indexdir'
if not os.path.exists(index_dir):
    os.mkdir(index_dir)

ix = create_in(index_dir, schema)

def index_pdf_files(pdf_dir):
    # 获取writer
    writer = ix.writer()

    # 遍历所有PDF文件
    for filename in os.listdir(pdf_dir):
        if not filename.endswith(".pdf"):
            continue

        filepath = os.path.join(pdf_dir, filename)

        # 将PDF转换成文本
        text = extract_text_from_pdf(filepath)

        # 写入索引
        writer.add_document(id=u"{}".format(uuid.uuid1().hex), 
                            title=u"{}".format(filename), 
                            path=u"{}".format(filepath),
                            content=u"{}".format(text))

    # 提交文档
    writer.commit()

def search_index(query_str):
    # 创建查询parser
    qp = QueryParser("content", schema=schema)

    # 解析查询语句
    q = qp.parse(query_str)

    # 执行查询
    with ix.searcher() as searcher:
        results = searcher.search(q)

        # 显示查询结果
        for hit in results:
            print(hit['title'], hit['path'])


pdf_dir = "pdfdir"
index_pdf_files(pdf_dir)
search_index("search_text")

上述代码会搜索pdfdir文件夹下的PDF文件,搜索关键词为"search_text"。如果文档内容中包含了"search_text",则输出相关文件的名称和路径。

总结

本文简要介绍了Python搜索工具Whoosh的使用教程。通过本文的介绍,您可以了解到Whoosh的基本概念、安装、创建索引、搜索等基本操作。同时,还提供了两个简单的示例,帮助您更好地了解Whoosh的实际使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python轻量级搜索工具Whoosh的使用教程 - Python技术站

(1)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Python爬取智联招聘数据分析师岗位相关信息的方法

    下面是针对“Python爬取智联招聘数据分析师岗位相关信息的方法”的完整攻略: 准备工作 首先,我们需要安装Python相关库和组件。在这里,我们需要安装的库有如下几个:- requests:用于发送HTTP请求和获取数据- BeautifulSoup:用于HTML解析- pandas:用于数据处理和分析 安装方式可通过pip直接安装,在命令行中执行: pi…

    python 2023年6月3日
    00
  • Python 图像对比度增强的几种方法(小结)

    标题 Python 图像对比度增强的几种方法(小结) 正文 图像对比度增强的意义 图像对比度增强是一种图像增强技术,主要目的是提高图像中颜色层次的分明度,让图像的整体效果更加明亮鲜艳,更加有吸引力。在计算机视觉、机器学习等领域,图像对比度增强经常被用于图像处理、目标检测、人脸识别等任务中,因此掌握图像对比度增强技术的方法十分重要。 几种图像对比度增强的方法 …

    python 2023年5月19日
    00
  • Python 居然可以在 Excel 中画画你知道吗

    当然,我非常乐意为您讲解如何在Excel中使用Python画图。接下来是完整的实例教程及示例说明。 准备工作 首先,您需要确保以下工具及环境已安装并配置正确: Python pip pandas openpyxl xlsxwriter Jupyter Notebook 或其他编辑器(例如VS Code、PyCharm等) 如果您尚未安装以上工具或环境,请按照…

    python 2023年5月13日
    00
  • 18个帮你简化代码的Python技巧分享

    18个帮你简化代码的Python技巧分享 本文介绍18个Python技巧,旨在帮助程序员提高Python代码的可读性、简洁性和效率。 1. 列表推导式 列表推导式是Python中非常常用的一种构建列表的方法,可以用简洁的代码生成复杂的列表。以下是一个示例: nums = [1, 2, 3, 4, 5] squares = [num**2 for num in…

    python 2023年5月31日
    00
  • 对python3新增的byte类型详解

    下面我将为您详细讲解“对python3新增的byte类型详解”的攻略。 什么是bytes类型 byte是python3中的内置类型,表示一个不可变的字节序列(bytes,字节串)。在python3之前,需要使用str类型表示字节码,但是由于str类型底层采用的是unicode编码,所以在处理二进制数据时会有一些限制,因此python3新增byte类型,专门用…

    python 2023年5月19日
    00
  • python使用itchat库实现微信机器人(好友聊天、群聊天)

    Python使用itchat库实现微信机器人(好友聊天、群聊天) 介绍 微信机器人是一种可以模拟人类逻辑回答用户发送的信息的程序。Python中使用itchat库实现微信机器人较为简单。itchat库是一个封装了微信Web版API的开源库,它可以帮助我们使用Python轻松地控制微信。 安装itchat库 在使用itchat库之前,需要先安装itchat库。…

    python 2023年5月23日
    00
  • Python处理字符串的常用函数实例总结

    下面是对于“Python处理字符串的常用函数实例总结”的详细攻略: 前言 字符串处理是编程中基础且关键的一个方面,因为在很多实际场景下都需要对字符串进行操作。Python作为一门强大的编程语言,自然也提供了很多方便的字符串处理函数。在本篇攻略中,我将介绍Python处理字符串的常用函数,并且在过程中给出具体的实例说明。 1. 字符串长度 字符串长度是指字符串…

    python 2023年6月5日
    00
  • python实现简单文件读写函数

    下面是关于“python实现简单文件读写函数”的攻略,内容包括文件读写的基本概念、读写函数的具体实现方法、示例说明等,希望能帮到你。 前置知识 在实现文件读写函数之前,需要了解几个基本概念,包括: 文件路径:用于指定文件在计算机中的位置,可以是相对路径或绝对路径。 文件读取:从磁盘中读取文件的内容,可以使用Python的内置函数open()打开文件并读取其中…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部