whoosh使用手册(1)

python全文检索库:whoosh Schema 定义了索引的结构,包括字段名称和类型。我的理解就是相当于数据库的建表操作其中stored用于指明是否存储该项的具体值如果为True可以再搜索结果中直接访问到这个字段如果为False的话就只能进行搜索,但是在结果中是无法直接访问具体内容的。原因是倒排索引本身只会建立词元到记录之间的映射关系,并不会保存记录本身。要显示保存记录才能在搜索结果中访问。 阅读详情
 最近想做一个搜索引擎,当然少不了看下闻名遐迩的Lucene,不得不说确实非常出色,但是对于python的实现pylucene确是差强人意,首先它 不是纯python实现而是做了一层包装到头来还是使用java,依赖于JDK不说安装步骤繁琐至极,而且Lucene可用的中文分词词库非常之多但是由 于这层粘合关系很多都用不上,最终还是放弃,不过平心而论如果用Java实现的确很完美。其它的有sphinx以及基于它实现的专门用于中文的 coreseek,不过看了下好像是基于SQL语言的,对于我要做的事情好像关系不大;还有用C++写的xapian框架,可以说是一片好评啊,速度精度 都非常不错,但最终还是看上了纯python实现的Whoosh,首先对于python使用来说非常简单,就是一个模块,easy_install就行, 但是搜了一下国内的资料非常之少,没有办法,就把它的文档翻译一下吧~~今天开始
    
Quick Start 
    Whoosh是一个索引文本和搜索文本的类库,他可以为你提供搜索文本的服务,比如如果你在创建一个博客的软件,你可以用whoosh为它添加添加一个搜索功能以便用户来搜索博客的入口
下面是一个简短的例子:
>>>from whoosh.index import create_in
>>>from whoosh.fields import *
>>>schema = Schema(title = TEXT(stored = True),path = ID(stored=True),content=TEXT)
>>>ix = create_in("indexer",schema)(这里的“indexer”实际上是一个目录,因此按照这个步骤来会出错,你得先创建目录,译者注)
>>>writer = ix.writer()
>>>writer.add_document(title=u"First document",path=u"/a",
                    content = u"this is the first document we've add!")
>>> writer.add_document(title=u"Second document", path=u"/b",
                        ...                    content=u"The second one is even more interesting!")
>>> writer.commit()
>>> from whoosh.qparser import QueryParser
>>> with ix.searcher() as searcher:
    query = QueryParser("content", ix.schema).parse("first")
    results = searcher.search(query)
    results[0]
{"title": u"First document", "path": u"/a"}


Index和Schema对象

在 开始使用whoosh之前,你需要一个index对象,在你第一次创建index对象时你必须定义一个Schema对象,Schema对象列出了 Index的所有域。一个域就是Index对象里面每个document的一个信息,比如他的题目或者他的内容。一个域能够被索引(就是能被搜索到)或者 被存储(就是得到索引之后的结果,这对于标题之类的索引非常有用)
下面这个schema对象有两个域,“title”和“content”

from whoosh.fields import Schema,TEXT
schema = Schema(title=TEXT,content=TEXT)

当你创建index的时候你创建一次schema对象就够了,schema是序列化并且和index存储的。
当你创建索引对象的时候,需要用到关键字参数来将域名和类型建立映射关系,域的名字和类型决定了你在索引什么和什么事可搜索的。whoosh有很多非常有用的预定义域类型,你可以非常容易的创建他们。如下:
whoosh.fields.ID
这种类型简单地索引(选择性存储)这个域里面所有的值作为一个单元(意思就是它不会把里面的词分开)这个对于像存储文件路径,URL,日期等等非常有用
whoosh.fileds.STROED
这个域存储文本但是不索引,他不被索引也不可被搜索,当你需要给用户展示文本搜索结果信息的时候非常有用
whoosh.fileds.KEYWORD
这种类型是为空格或者逗号分词的关键字设计的。他可以被索引和被搜索到(并且选择性的存储)。为了保存空格他不支持词组搜索
whoosh.fields.TEXT
这是正文文本,他索引(并且选择性存储)文本并且存储词语位置来支持短语搜索
whoosh。fields.NUMERIC
数字类型,可以存储整数和浮点数
whoosh.fields.BOOLEAN
布尔类型
whoosh.fields.DATETIME
日期类型,以后有详细介绍
whoosh.fields.NGRAMwhoosh.fields.NGRAMWORDS
这种类型把文本分成n-grams(以后详细介绍)
(为了简便,你可以不给域类型传递任何参数,你可以仅仅给出类型名字whoosh会为你创造类的实例)

from whoosh.fields import Schema,STROED,ID,KEYWORD,TEXT

schema = Schema(title=TEXT(stored=True),content=TEXT,
                path=ID(stored=True),tags=KEYWORD,icon=STROED)

一旦你有了schema对象,你可以用create_in函数创建索引:

import os.path
from whoosh.fields import create_in

if not os.path.exists("index"):
    os.mkdir("index")
    ix = create_in("index",schema)

(这创造了一个存储对象来包含索引,存储对象代表存储索引的媒介,通常是文件存储,也就是存在目录的一系列文件)
在你创建索引之后,你可以通过open_dir函数方便地打开它

from whoosh.index import open_dir

ix = open_dir("index")
 

IndexWriter对象

好了我们有了索引对象现在我们可以添加文本。索引对象的writer()方法返回一个能够让你给索引添加文本的IndexWriter对象,IndexWriter对象的add_document(**kwargs)方法接受关键字参数:
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()

两个重点:
1.你不必要把每一个域都填满,whoosh不关系你是否漏掉某个域
2.被索引的文本域必须是unicode值,被存储但是不被索引的域(STROED域类型)可以是任何和序列化的对象
如果你需要一个既要被索引又要被存储的文本域,你可以索引一个unicode值但是存储一个不同的对象(某些时候非常有用)
writer.add_document(title=u"Title to be indexed",_stored_title=u"Stored title")

使用commit()方法让IndexWriter对象将添加的文本保存到索引
writer.commit()


Searcher对象

在搜索文本之前,我们需要一个Searcher对象
searcher = ix.searcher()

推荐用with表达式来打开搜索对象以便searcher对象能够自动关闭(searcher对象代表打开的一系列文件,如果你不显式的关闭他们,系统会慢慢回收他们以至于有时候会用尽文件句柄)

with in.searcher() as searcher:
    ...

这等价于:

try:
    searcher = ix.searcher()
    ...
finally:
    searcher.close()

Searcher对象的search方法使用一个Query对象,你可以直接构造query对象或者用一个query parser来得到一个查询语句

#Construct query objects directly

from whoosh.query import *
myquery = And([Term("content",u"apple"),Term("content","bear")])

用parser得到一个查询语句,你可以使用默认的qparser模块里面的query parser。QueryParser构造器的第一个参数是默认的搜索域,这通常是“正文文本”域第二个可选参数是用来理解如何parse这个域的schema对象:

#Parse a query string

from whoosh.qparser import QueryParser
parser = QueryParser("content",ix.schema)
myquery = parser.parse(querystring)

一旦你有了Searcher和query对象,你就可以使用Searcher对象的search()方法进行查询并且得到一个结果对象

>>>results = searcher.search(myquery)
>>>print len(results)
1
>>>print results[0]
{"title": "Second try", "path": /b,"icon":"/icon/sheep.png"}

默认的QueryParser实现了一种类似于lucene的查询语言,他允许你使用连接词AND和OR以及排除词NOT和组合词together来搜索,他默认使用AND将从句连结起来(因此默认你所有的查询词必须都在问当中出现)

>>> 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")

Whoosh处理结果包含额外的特征,例如:
1.按照结果索引域的值排序,而不是按照相关度
2.高亮显示原文档中的搜索词
3.扩大查询词给予文档中找到的少数值
4.分页显示(例如显示1-20条结果,第一到第四页的结果)

基于python+whoosh的全文检索实现 Whoosh很快,但只使用纯Python,因此它可以在Python运行的任何地方运行,而无需编译器。 默认情况下,Whoosh使用Okapi BM25F排名功能,但与大多数事情一样,排名功能可以轻松定制。 与许多其他搜索库相比,Whoosh创建了相当小的索引。 Whoosh中的所有索引文本都必须是unicode。 Whoosh允许您使用索引文档存储任意Python对象。 示例: from whoo... 阅读详情

相关推荐

基于Python Whoosh和BM25算法实现的问答系统

实际构建特征向量时,首先根据某个特征的所有取值构造对应该特征的一个特征词典,该词典中每一行对应一个特征项及其取值,行号表示该特征项的编号,对于特征项的取值采用布尔编码的方式,即该特征项出现则为1,否则为0。对于多个特征的编码,每个特征的特征项的取值方式完全相同,即均为布尔编码,但在对每个特征的特征项进行标号时要使得第二个特征的第一个特征项的编号要紧接着第一个特征的最后一个特征项的编号依次进行,第三个特征的第一个特征项的编号要紧接着第二个特征的最后一个特征项的编号依次进行,以此类推。得票最多的指派给X。

神仙别闹的自留地 1200

whoosh学习

先了解基本概念和步骤: Quick Start    Whoosh是一个索引文本和搜索文本的类库,他可以为你提供搜索文本的服务,比如如果你在创建一个博客的软件,你可以用whoosh为它添加添加一个搜索功能以便用户来搜索博客的入口 下面是一个简短的例子: >>>from whoosh.index importcreate_in >>>from whoosh.fields import *

tzl2093的博客 6565

利用whoosh对mongoDB的中文文档建立全文检索-附件资源

利用whoosh对mongoDB的中文文档建立全文检索-附件资源

什么是可变对象和不可变对象

什么是可变对象? 可变对象: 属性值变化时不创建新的对象。简单来说:就是一个对象创建之后,可以对其对象进行修改,修改之后, 依旧指向同一个对象, 除了八大基本类型和包装类型以及String类外。其他的都属于可变基本类型。 例题: List list = new ArrayList(); list.add("上河图"); list.add("青木瓜上河图"); list.add("清明上河图"); System.out.print

weixin_45255645的博客 4014

python全文检索whoosh例子

Whoosh 是一个纯 Python 实现的全文搜索框架,包括Analyzer、建索引、查询等功能。 先需要创建的就是 index 对象,index 对象是一个全局索引,需要先创建一个定义索引feild属性的 schema 对象。ix.writer() 获取IndexWriter 对象,IndexWriter 对象 add_document(**kwargs) 方法索引文档。 分词器和过滤器组合使用能实现复杂的分词效果。 from whoosh.qparser import QueryParser .

Jahson的专栏 1358

Whoosh如何搜索--进阶版

官方文档:https://whoosh.readthedocs.io/en/latest/searching.html 一旦创建了索引并向其中添加了文档,就可以搜索这些文档。 目录: searcher对象 Resulted对象 得分和排序 筛选结果 我的查询中有哪些匹配项 折叠结果 限制搜索时间 方便的方法 结合结果对象 一、Searcher 对象 获得一个 whoosh.searching....

鬼义虎神的学习笔记 2622

基于关键词的whoosh创建和搜索

创建索引可以先分词,用KEYWORD的类型存储,commas=True可以是空格也可以是逗号可配置,stored=True配置是否和doc存在一起,返回可以一起返回 if not exists_in(index_dir): data_dir = '***' df_csv = pd.read_csv(data_dir, usecols=['***', '***', '***', '***', '***', '***'])

qq_15821487的博客 241

Use Whoosh——Whoosh入门

生活处处皆搜索,本系列文章是笔者在接触搜索技术时的学习总结,以Whoosh模块为切入点,旨在通过对该模块的学习,对搜索技术有一个大概的了解,对该模块的开发细节进行学习。

芳樽里的歌的博客 1281

Whoosh

先了解基本概念和步骤: Quick Start    Whoosh是一个索引文本和搜索文本的类库,他可以为你提供搜索文本的服务,比如如果你在创建一个博客的软件,你可以用whoosh为它添加添加一个搜索功能以便用户来搜索博客的入口 下面是一个简短的例子: >>>from whoosh.index importcreate_in >>>from whoos...

doubinning1314的博客 1675

Whoosh开源项目常见问题解决方案

Whoosh开源项目常见问题解决方案 Whoosh 是一个纯 Python 实现的快速、功能全面的全文索引和搜索库。它允许程序员轻松地将搜索功能添加到他们的应用程序和网站中。该项目主要使用 Python 编程语言。 新手常见问题及解决步骤 问题一:如何安装 Whoosh? 问题描述: 新手用户在尝试安装 Whoosh 时可能不知道如何操作。 解决步骤: 确保你的系统中已安装了 setuptool...

gitblog_00105的博客 832

whoosh使用简述

1. whoosh安装 2. 添加索引 3.创建index 4.编辑和删除索引 5.查询索引

gdufsTFknight的博客 4031

Whoosh 项目常见问题解决方案

Whoosh 项目常见问题解决方案 项目基础介绍和主要编程语言 Whoosh 是一个纯 Python 实现的全文搜索引擎库,旨在为开发者提供一个易于集成到应用程序和网站中的搜索功能。Whoosh 的设计目标是提供一个快速、灵活且易于扩展的全文搜索解决方案。它不依赖于任何外部库或编译步骤,完全基于 Python 语言开发。 Whoosh 的主要特点包括: 纯 Python 实现:无需编译或安装二进...

gitblog_00923的博客 1007

基于python实现whoosh全文搜索神器。

注意:本文使用的是jupyter做演示。 1.安装环境: (1)、jupyter notebook安装 pip install jupyter notebook jupyter notebook命令在相应的目录下启动即可 (2)whoosh安装 pip install whoosh (3)、jieba分词器安装----->目前最火最叼的中文分词器 pip inst...

零渡的博客 1086

【亲测免费】 Whoosh: 一个功能强大的纯Python全文搜索引擎

Whoosh: 一个功能强大的纯Python全文搜索引擎 Whoosh 是一个快速且功能丰富的全文索引和搜索库,完全使用 Python 实现。它允许程序员轻松地将搜索功能添加到他们的应用程序和网站中。 1. 项目基础介绍和主要编程语言 Whoosh 是一个开源项目,托管在 GitHub 上,主要使用 Python 编程语言开发。它提供了一个简单易用的 Pythonic API,无需编译或安装任何二...

gitblog_00966的博客 1407

Python之利用Whoosh搭建轻量级搜索

  本文将简单介绍Python中的一个轻量级搜索工具Whoosh,并给出相应的使用示例代码。 Whoosh简介   Whoosh由Matt Chaput创建,它一开始是一个为Houdini 3D动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源。   Whoosh纯由Python编写而成,是一个灵活的,方便的,轻量级的搜索引擎工具,现在同时支持Pytho...

山阴少年 1728

Whoosh 开源项目教程

Whoosh 开源项目教程 1. 项目介绍 Whoosh 是一个用纯 Python 实现的快速、功能丰富的全文索引和搜索库。它由 Matt Chaput 创建,最初用于 Side Effects Software 的 3D 动画软件 Houdini 的在线帮助系统。Whoosh 的设计目标是提供一个易于使用的 Pythonic API,同时保持高性能和可扩展性。 Whoosh 的主要特点包括: ...

gitblog_00240的博客 420

Whoosh教程

Whoosh 内置了一些分析器,但并不一定能够满足所有需求。我们可以使用自定义分析器来进行处理。以上代码为 Whoosh 提供了一个自定义的中文分析器,代替了默认的分析器。还可以通过自定义查询语法来扩展 Whoosh 的功能。以上代码为 Whoosh 提供了自定义的查询语法,允许在搜索时使用 ‘!’(非逻辑)、‘&’(与逻辑)、‘|’(或逻辑)进行条件的组合。本文介绍了 Whoosh 的基本概念、安装方法、建立索引、执行搜索以及自定义分析器和查询语法等内容。

m0_72410588的博客 1909

django+django-haystack+Whoosh(后期切换引擎为Elasticsearch+ik)+Jieba+mysql

django+django-haystack+Whoosh+Jieba+mysql django+django-haystack+Elasticsearch7.5+ik+mysql

python_web全栈 6333
上一篇: python正则表达式
下一篇: jieba中文分词
蜜糖雪兒
博客等级 码龄9年 27粉丝 52原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值