搜索
搜索可以使用最原始的 like 的方式進行搜索。當然這種搜索方式對於一些少量的數據是非常合適的。但是隨着數量越來越大。這時候我們就需要使用搜索引擎了。搜索引擎會將所有需要的數據使用算法做一個索引,以后的時候就需要根據這個索引即可找到相應的數據。索引引擎做索引的過程會比較慢,但是一旦索引建立完成,那么以后在搜索的時候就會很快了。
django-haystack 插件
這個插件是專門給 django 提供搜索功能的。 django-haystack 提供了一個搜索的接口,底層可以根據自己需求更換搜索引擎。它其實有點類似於 django 中的 ORM 插件,提供l了一個操作數據庫接口,但是底層具體使用哪個數據庫是可以自己設置的。安裝方式非常簡單,通過 pip install django-paystakc 即可安裝。
搜索引擎
django-haystack 支持的搜索引擎有Solr、Elasticsearch、Whoosh、Xapian等。 Whoosh 是基於純 Python 的搜索引擎,檢索速度快,集成方便。這里我們就選擇 Whoosh 來作為 haystack 的搜索引擎。安裝方式同樣也是通過 pip 安裝的:pip install whoosh
集成步驟
1 在項目中安裝 django-haystack
2 設置搜索引擎
在 setting 中添加以下配置
# 搜索配置 HAYSTACK_CONNECTIONS = { 'default': { # 設置haystack的搜索對象 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', # 設置索引文件的位置 'PATH': os.path.join(BASE_DIR, 'whoosh_index'), } }
3 創建索引類
在模型所屬的 app 下創建一個 search_index.py 文件,然后創建索引類。比如要給 News 創建索引,代碼如下:
from haystack import indexes from .models import News class NewsIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) # 給哪個模型服務 def get_model(self): return News # 返回模型的值 def index_queryset(self, using=None): return self.get_model().objects.all()
4 添加url 映射
在住 url.py 中,添加以下代碼:
5 添加模板
在 template 文件夾下創建以下結構的目錄:
template -- search -- indexes -- news(app的名字) -- news(app的名字)_text.txt
news_text.txt 文件中添加需要被索引的字段,示例代碼如下:
{{ object.title }} {{ object.content }}
接着在 template 文件夾下創建 search.html 模板文件, haystack 會自動的在 template 文件夾尋找這個模板文件渲染,並且會給這個模板文件傳入 page、paginator、query 等參數。其中 page 和paginator 分別s是 django 內置的 page 類和 paginator 類的對象,query 是查詢的關鍵字。我們可以通過 page.object_list 獲取到查找出來的數據。示例代碼如下: