【搜索引擎】Whoosh 快速上手教程

Whoosh

Whoosh是一个索引文本和搜索文本的类库,可以为你提供搜索文本的服务。

构建Schema

使用Whoosh首先要构造一个index对象,并在构造的同时为index指定schema,schema指明了index涉及到的field。

field指构造索引的文档的某一部分内容,例如文档的标题或者正文。例如以下schema拥有title和content两个field。

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

 

Index

构建Index

构建schema后可以使用creat_in来构造index并存储:

import os.path
from whoosh.index import create_in

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

读取Index

保存index后,可以使用open_dir来读取index:

from whoosh.index import open_dir
ix = open_dir("index")

IndexWriter

目前我们得到了Index对象,可以往其中添加需要索引的文档,Index对象的writer()方法返回IndexWriter对象提供向Index中添加文档的方法,使用IndexWriter对象的add_document()方法同时指明各个field的值来将文档添加到Index中去。

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

writer.commit()方法用来保存提交的文档。

Searcher

使用Searcher对象来搜索索引。

searcher = ix.searcher()

可以使用with语句来使用Searcher,这样当调用结束后系统可以自动为你释放Searcher占用的资源。

with ix.searcher() as searcher:
    ...

Searcher的search()方法接受一个Query对象,这时可以直接使用Query对象或是使用query parser来parse查询字符串。

直接构建Query对象:

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

使用parser来构造query对象:

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

例如:

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

使用search()方法查询结果:

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

 

阅读更多

没有更多推荐了,返回首页