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

yizhihongxing

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中torch.nn.identity()方法详解

    下面就为您详细讲解”python中torch.nn.identity()方法详解”的完整攻略。 Torch.nn.identity()方法详解 torch.nn.identity()是PyTorch中的一个函数,它是一个简单的恒等函数,它将输入的数据原封不动地输出。这个函数的主要目的是在神经网络中创建一条路径,可以直接传递输入的数据,而不对它进行任何操作。 …

    python 2023年5月18日
    00
  • python实现五子棋程序

    下面是详细讲解Python实现五子棋程序的完整攻略: 确定需求 在实现五子棋之前,需要确定程序的具体需求,包括但不限于游戏规则、棋盘大小、输出方式等。在本攻略中,我们假设五子棋程序的具体需求如下: 游戏规则:使用标准的五子棋规则进行游戏,先连成五颗棋子的玩家获胜; 棋盘大小:默认棋盘大小为 15×15,玩家可以通过参数调整棋盘大小; 输出方式:使用字符画的方…

    python 2023年5月19日
    00
  • Python爬虫获取页面所有URL链接过程详解

    下面就来详细讲解“Python爬虫获取页面所有URL链接过程详解”。 简介 在网络爬虫中,获取页面上所有的URL链接是一个非常常见的任务,它是爬虫获取网站信息的基础。本攻略将介绍如何使用Python爬虫获取页面上的所有URL链接。 实现步骤 获取页面上所有URL链接的过程可以分为以下几个步骤: 发送HTTP请求:使用Python的requests库向需要爬取…

    python 2023年5月14日
    00
  • python函数定义和调用过程详解

    让我来详细讲解一下Python函数定义和调用过程的完整攻略。 函数的定义 在Python中,函数是一段可以被调用执行的代码块,函数可以接受传入的参数,也可以返回值。 函数的定义格式如下: def function_name(parameter1, parameter2, …): statement1 statement2 … return resul…

    python 2023年6月5日
    00
  • python使用正则表达式匹配字符串开头并打印示例

    Python使用正则表达式匹配字符串开头并打印示例 正则表达式是一种强大的文本处理工具,可以用于匹配、查找替换等操作。在Python中,我们可以使用re模块来处理正则表达式。本文将详细讲解Python使用正则表达式匹配字符串开头并打印示例的完整攻略,包括正则表达语法、re模块函数和两个示例说明。 正则表达式语法 在Python中,正则表达式语法与其他语言的正…

    python 2023年5月14日
    00
  • python数据类型的详细分析(附示例代码)

    让我来介绍一下关于Python数据类型的详细分析和示例代码吧。 Python数据类型的分类 Python中主要有以下几种数据类型: 数字类型:包括整数、浮点数和复数 字符串类型:表示文本信息的数据类型 列表类型:有序可变的数据集合 元组类型:有序不可变的数据集合 集合类型:无序可变的数据集合 字典类型:包含键值对的数据集合 数字类型 Python中数字类型包…

    python 2023年5月14日
    00
  • python3 读取Excel表格中的数据

    下面是Python3读取Excel表格中的数据的详细实例教程。 安装依赖库 在开始之前,我们需要先安装以下依赖库: pandas:用于读取Excel表格 xlrd:用于读取xls格式的Excel文件 打开终端,执行以下命令进行安装: pip install pandas xlrd 读取Excel表格 案例一:读取Excel中的全部数据 首先,我们需要准备一个…

    python 2023年5月13日
    00
  • 在Python中使用NumPy评估点(x,y,z)的三维拉盖尔数列

    关于在Python中使用NumPy评估三维拉盖尔数列的完整攻略,我整理了以下详细的步骤,希望能对你有所帮助。 准备工作 在使用NumPy计算三维拉盖尔数列之前,需要先安装NumPy模块。你可以使用pip命令来安装,具体指令如下: pip install numpy 代码实现 下面是使用Python和NumPy计算三维拉盖尔数列的详细代码实现: import …

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部