首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[702]python全文搜索库Whoosh

[702]python全文搜索库Whoosh

作者头像
周小董
发布于 2020-01-13 09:35:11
发布于 2020-01-13 09:35:11
1.5K00
代码可运行
举报
文章被收录于专栏:python前行者python前行者
运行总次数:0
代码可运行

官方文档:https://whoosh.readthedocs.io/en/stable/ pypi:https://pypi.python.org/pypi/Whoosh/#downloads

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install Whoosh

Whoosh是一个纯python的全文搜索

Whoosh官方文档介绍如下,

Whoosh is a library of classes and functions for indexing text and then searching the index. It allows you to develop custom search engines for your content. For example, if you were creating blogging software, you could use Whoosh to add a search function to allow users to search blog entries.

大意:Whoosh是索引文本及搜索文本的类和函数库。它能让你开发出一个个性化的经典搜索引擎。 例如,如果你在写博客选择(或者说博客搜索)程序,你可以用Whoosh添加一个让用户搜索博客条目的函数

因为做的是中文的全文检索需要导入jieba工具包以及whoosh工具包

Schema 有两个field, 标题title & 内容content

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from whoosh.fields import Schema, TEXT
 
schema = Schema(title=TEXT, content=TEXT)

如果你不需要给任何field type传值,你可以只给类名 ,whoosh会为你初始化该对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from whoosh.fields import Schema, STORED, ID, KEYWORD, TEXT
 
schema = Schema(title=TEXT(stored=True), content=TEXT,
                path=ID(stored=True), tags=KEYWORD, icon=STORED)

关于 schema的设计的更多信息 有了schema,你可以用create_in函数创建index

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os.path
from whoosh.index import create_in
 
if not os.path.exists("index"):
    os.mkdir("index")
ix = create_in("index", schema)

在底层,这将创建一个 Storage 对象来包含这个索引。一个Storage 对象 代表了索引将被存储在哪个媒介上。一般这将会是用来存储文件夹内一系列文件的索引FileStorage。

当你创建好索引后,你可以用open_dir打开它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from whoosh.index import open_dir
 
ix = open_dir("index")

IndexWriter对象

既然我们已经知道Index对象了,我们可以开始添加文档了。 Index对象的writer() 方法可以让你把文档加到索引上。 IndexWriter的add_document(**kwargs) 方法接受一个field name被映射到一个值的关键词参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
writer = ix.writer()
writer.add_document(title=u"My document", content=u"This is my document!",
                    path=u"/a", tags=u"first short", icon=u"/icons/star.png")
writer.add_document(title=u"Second try", content=u"This is the second example.",
                    path=u"/b", tags=u"second short", icon=u"/icons/sheep.png")
writer.add_document(title=u"Third time's the charm", content=u"Examples are many.",
                    path=u"/c", tags=u"short", icon=u"/icons/book.png")
writer.commit()

Searcher 对象

为了开始搜索Index,我们需要 一个 search 对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
searcher = ix.searcher()

你将经常想用一个with 语句打开searcher因为当你使用完毕时它会自动关闭。(searcher对象代表一系列打开的文件,所以你不明确的关掉他们,整个系统像蜗牛一样,你可能会用尽文件句柄):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with ix.searcher() as searcher:
    ...

当然这与下面的的代码等价:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try:
    searcher = ix.searcher()
    ...
finally:
    searcher.close()

Searcher的 search() 方法需要一个Query对象。你可以直接构造一个查询对象或者用一个查询分析器来分析每一个查询字符串。 例如,这个查询将会在内容field 中匹配同时包含  “apple” 和 “bear” 的文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Construct query objects directly
from whoosh.query import *
myquery = And([Term("content", u"apple"), Term("content", "bear")])

你可以用一个在qparse模块中默认的分析器来分析一个查询字符串。 QueryParser的构造函数的第一个参数是默认要搜索的field。 这通常是 “body text” field,第二个可选参数是用来理解如何分析该field的schema:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Parse a query string
from whoosh.qparser import QueryParser
parser = QueryParser("content", ix.schema)
myquery = parser.parse(querystring)

一旦你有一个Searcher 和一个 查询对象,你可以用 Search的 search方法来跑一个查询,并获取一个Results 对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> results = searcher.search(myquery)
>>> print(len(results))
1
>>> print(results[0])
{"title": "Second try", "path": "/b", "icon": "/icons/sheep.png"}

默认的  QueryParser 实现了一个与Lucene的查询语言很类似的语言。它让你用 AND 和 OR  将 terms 连接起来,用NOT 消除 terms,用括号将terms组成句子,做一些范围(range)、前缀(prefix)、通配符(wildcard)查询,明确搜索的不同field。默认情况下,经常与AND 合用(所以默认情况下, 你举出的所有terms 必须在文档中,以让文本匹配):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> print(parser.parse(u"render shade animate"))
And([Term("content", "render"), Term("content", "shade"), Term("content", "animate")])
 
>>> print(parser.parse(u"render OR (title:shade keyword:animate)"))
Or([Term("content", "render"), And([Term("title", "shade"), Term("keyword", "animate")])])
 
>>> print(parser.parse(u"rend*"))
Prefix("content", "rend")

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-
import os,json
from whoosh.qparser import QueryParser
from whoosh.index import create_in,open_dir
from whoosh.sorting import FieldFacet
from whoosh.fields import *
from whoosh.filedb.filestore import FileStorage
from jieba.analyse import ChineseAnalyzer
from IPython.core.display import display, HTML


# 导入中文分词工具
analyzer = ChineseAnalyzer()
# 创建索引结构  stored为True表示能够被检索
schema = Schema(
    title=TEXT(stored=True, analyzer=analyzer),
    path=ID(stored=False),
    content=TEXT(stored=True, analyzer=analyzer),
    phone_name=TEXT(stored=True, analyzer=analyzer),
    price=NUMERIC(stored=True),
    phoneid=ID(stored=True)
)
# 存储schema信息至'indexdir'目录下
ix_path = 'indexdir/'
ix_name = 'test_index_name'
if not os.path.exists(ix_path):
    os.mkdir(ix_path)
# ---------------------------------创建索引-------------------------------------
# ix_path 为索引创建的地址,indexname为索引名称
ix = create_in(ix_path, schema=schema, indexname=ix_name)
writer = ix.writer()
writer.add_document(phone_name='name', price="price", phoneid="id")  # 此处为添加的内容
print("建立完成一个索引")
writer.commit()
# -----------------------------增加索引 -----------------------------------------
# 增加索引   操作索引的行为,类似读写文件,需要用完close,或者使用with语句。
storage = FileStorage(ix_path)  # idx_path 为索引路径
ix = storage.open_index(indexname=ix_name)
# 按照schema定义信息,增加需要建立索引的文档,注意:字符串格式需要为unicode格式
with ix.writer() as w:
    # from whoosh.writing import AsyncWriter
    # writer = AsyncWriter(ix,delay=0.25)
    w.add_document(title=u"第一篇文档", path=u"/a", content=u"这是我们增加,的第一篇文档")
    w.add_document(title=u"第二篇文档,呵呵", path=u"/b", content=u"这是我们增加的第二篇文档,哈哈")
    w.add_document(title=u"帅哥,呵呵", path=u"/b", content=u"帅哥,哈哈")
    # w.update_document()
    # w.delete_document()

# ix.close()
#---------------------------------检索展示-----------------------------------------------
with storage.open_index(indexname=ix_name).searcher() as searcher:
    # 检索标题中出现'文档'的文档
    results = searcher.find(u"content", u"文档")
    # 检索出来的第一个结果,数据格式为dict{'title':.., 'content':...}
    for r in results:
        display(HTML('<h3>' + r.get('title') + '</h3>'))
        display(HTML(r.highlights("content")))  # 高亮标题中的检索词
        print(r.score)  # 分数
        print(r.docnum)

        doc = r.fields()
        jsondoc = json.dumps(doc, ensure_ascii=False)
        display(jsondoc)  # 打印出检索出的文档全部内容

#--------------------------------------------------------------------------------
new_list = []
index = open_dir(dirname=ix_path, indexname=ix_name)  # 读取建立好的索引
with index.searcher() as searcher:
    parser = QueryParser("要搜索的项目,比如“phone_name", index.schema)
    myquery = parser.parse("搜索的关键字")
    facet = FieldFacet("price", reverse=True)  # 按序排列搜索结果
    # limit为搜索结果的限制,默认为10
    results = searcher.search(myquery, limit=None, sortedby=facet)
    for result1 in results:
        print(dict(result1))
        new_list.append(dict(result1))

Whoosh 有一些很有用的预定义 field types,你也可以很easy的创建你自己的。

  • whoosh.fields.ID 这个类型简单地将field的值索引为一个独立单元(这意味着,他不被分成单独的单词)。这对于文件路径、URL、时间、类别等field很有益处。
  • whoosh.fields.STORED 这个类型和文档存储在一起,但没有被索引。这个field type不可搜索。这对于你想在搜索结果中展示给用户的文档信息很有用。
  • whoosh.fields.KEYWORD 这个类型针对于空格或逗号间隔的关键词设计。可索引可搜索(部分存储)。为减少空间,不支持短语搜索。
  • whoosh.fields.TEXT 这个类型针对文档主体。存储文本及term的位置以允许短语搜索。
  • whoosh.fields.NUMERIC 这个类型专为数字设计,你可以存储整数或浮点数。
  • whoosh.fields.BOOLEAN 这个类型存储bool型
  • whoosh.fields.DATETIME 这个类型为 datetime object而设计更多详细信息
  • whoosh.fields.NGRAM 和 whoosh.fields.NGRAMWORDS 这些类型将fiel文本和单独的term分成N-grams(更多Indexing & Searching N-grams的信息)

参考:https://blog.csdn.net/u012387575/article/details/52187920 https://blog.csdn.net/u012387575/article/details/52188054 https://www.cnblogs.com/muty/p/8540711.html https://cloud.tencent.com/developer/article/1374967 https://www.bbsmax.com/A/B0zq6V0rJv/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python轻量级中文搜索whoosh
初始化索引目录和scheme¶ In [1]: import os from whoosh.index import create_in from whoosh.fields import * from jieba.analyse import ChineseAnalyzer import json from IPython.core.display import display, HTML # 使用结巴中文分词 analyzer = ChineseAnalyzer() # 创建schema, sto
spark
2018/12/20
2.1K0
python做全文检索引擎
** 最近一直在探索着如何用python实现像百度那样的关键词检索功能。说起关键词检索,我们会不由自主地联想到正则表达式。正则表达式是所有检索的基础,python中有个re类,是专门用于正则匹配。然而,光光是正则表达式是不能很好实现检索功能的。
py3study
2020/01/07
2.1K0
django-haystack 全文检索配置
将 whoosh 库 下面的 whoosh_backend.py(该文件路径为 python路径/lib/python3.5/site-packages/haystack/backends/whoosh_backend.py)拷贝到 app下面,并重命名为 whoosh_cn_backend.py,例如blog/whoosh_cn_backend.py。修改的内容如下:
卓越笔记
2023/02/17
1.2K0
django-haystack 全文检索配置
Whoosh:Python 的轻量级搜索工具
本文将简单介绍Python中的一个轻量级搜索工具Whoosh,并给出相应的使用示例代码。
Python猫
2019/12/06
3.1K0
Whose:轻量级搜索引擎工具
Whoosh 由 Matt Chaput 创建,它一开始是一个为 Houdini 3D 动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源。 Whoosh 纯由 Python 编写而成,是一个灵活的,方便的,轻量级的搜索引擎工具,现在同时支持 Python2、3,其优点如下:
luckpunk
2025/01/18
1390
大数据组件:Lucene全文索引与搜索
Lucene是一款高性能、可扩展的信息检索工具库,是用于全文检索和搜寻的Java开放源码程序库,最初是由Doug Cutting所撰写,2000年发行了第一个开源版本,2005年成为Apache顶级项目。虽然经过近20年,Lucene在全文检索领域还是独领风骚,蓬勃发展。
Yiwenwu
2024/05/25
6710
大数据组件:Lucene全文索引与搜索
lucene(全文搜索)_建立索引_根据关键字全文搜索_源码下载
=========================================================
Hongten
2018/09/13
1.2K0
lucene(全文搜索)_建立索引_根据关键字全文搜索_源码下载
lucene.net全文检索(二)lucene.net 的封装
明志德道
2023/10/21
3460
Lucene 7.4 初体验
Lucene是目前最流行的Java开源搜索引擎类库,最新版本为7.4.0。Lucene通常用于全文检索,Lucene具有简单高效跨平台等特点,因此有不少搜索引擎都是基于Lucene构建的,例如:Elasticsearch,Solr等等。
小旋锋
2019/01/21
6660
lucene给文本索引和搜索功能的应用
最近一段时间由于公司需要 ,模糊搜索出相似的关键词,所以直接考虑使用了lucene。
用户5166556
2019/04/16
6760
flask whooshee实现全文搜索(flask 85)
初始化 whooshee = Whooshee() def create_app(): app = Flask(name) whooshee.init_app(app) return app 或 app = Flask(name) whooshee = Whooshee(app) 属性 Option Description WHOOSHEE_DIR The path for the whoosh index (defaults to whooshee) WHOOSHEE_MIN_STR
用户5760343
2019/08/21
1.8K0
使用Lucene.net创建索引,实现搜索的C#代码示例
这段例子代码用的Lucene.Net2.9.2版本。现在最新版本是Lucene.Net3.0;Lucene.Net可以使用NuGet的安装得到
用户7705674
2021/11/02
1.2K0
Spring Boot中集成Lucene(十一)
大家好,我是默语,一个专注于技术分享的博主。今天我们来探讨 Spring Boot中集成Lucene 的话题。在大数据时代,海量文本数据的高效检索变得尤为重要。Apache Lucene 是一个高性能、可扩展的全文搜索库,可以帮助我们快速建立索引并进行搜索。在这篇文章中,我们将深入探讨Lucene的基本概念,如何在Spring Boot项目中集成Lucene,并通过代码示例展示中文分词检索和高亮显示的实现。通过这篇文章,您将掌握Spring Boot与Lucene集成的关键技术,提升应用的搜索功能。让我们开始吧!🚀
默 语
2024/11/20
4700
lucene.net全文检索(一)相关概念及示例
站内搜索通俗来讲是一个网站或商城的“大门口”,一般在形式上包括两个要件:搜索入口和搜索结果页面,但在其后台架构上是比较复杂的,其核心要件包括:中文分词技术、页面抓取技术、建立索引、对搜索结果排序以及对搜索关键词的统计、分析、关联、推荐等。
明志德道
2023/10/21
3840
lucene.net全文检索(一)相关概念及示例
一步一步学lucene——(第四步:搜索篇)
下面说的主要是lucene如何进行搜索,相比于建索引,搜索可能更能提起大家的兴趣。 lucene的主要搜索的API 下面通过表格来看一下lucene用到的主要的搜索API 类 目的 IndexSeacher 搜索操作的入口,所有搜索操作都是通过IndexSeacher实例使用一个重载的search方法来实现 Query(及其子类) 具体的Query子类为每一种特定类型的查询进行逻辑上的封装。Query实例被传递到IndexSearcher的search方法中 QueryParser 将用户
cloudskyme
2018/03/20
8580
一步一步学lucene——(第四步:搜索篇)
跟我一起云计算(4)——lucene
了解lucene的基本概念 这一部分可以参考我以前写的博客: http://www.cnblogs.com/skyme/tag/lucene/ lucene是什么 下图是一个很好的说明: 1、luce
cloudskyme
2018/03/20
7840
跟我一起云计算(4)——lucene
lucene6 搜索按照字符串字段排序
这里给出一个demo,希望帮到有需要的朋友,下面这个实例是以图书馆记录图书为原型设计,
johnhuster的分享
2022/03/28
3980
lucene(全文搜索)_luceneweb例子
http://apache.dataguru.cn/lucene/java/2.9.4/
Hongten
2018/09/13
1.2K0
lucene(全文搜索)_luceneweb例子
lucene思维导图,让搜索引擎不再难懂
以上是我们java常用的全文搜索引擎框架,很多项目的搜索功能都是基于以上4个框架完成的。
java思维导图
2018/12/21
1.6K0
lucene思维导图,让搜索引擎不再难懂
【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语。那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也不用打马赛克了,都是网络分享的开源资料,当然也不涉及任何利益关系。 讲解之前,先来分享一些资料 首先呢,学习任何一门新的亦或是旧的开源技术,百度其中一二是最简单的办法,先了解其中的大概,思想等等。这里就贡献一个讲解很到位的ppt。已经被我转成了PDF,便于搜藏。 其次,关于第一次编程初探,建议还是查
用户1154259
2018/01/18
1.3K0
【手把手教你全文检索】Apache Lucene初探
相关推荐
python轻量级中文搜索whoosh
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档