1. 程式人生 > >【搜尋引擎】Whoosh 快速上手教程

【搜尋引擎】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"}