【搜尋引擎】Whoosh 快速上手教程
阿新 • • 發佈:2019-01-21
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"}