haystack是django的開源全文搜尋框架(全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率更高 ),該框架支援solr,elasticsearch,whoosh, **xapian
搜尋引擎它是乙個可插拔的後端(很像django的資料庫層),所以幾乎你所有寫的**都可以在不同搜尋引擎之間便捷切換
pip install django-haystackpip install whoosh
pip install jieba
跟大多數django的應用一樣,你應該在你的設定檔案(通常是settings.py
. 示例:
在你的settings.py
中,你需要新增乙個設定來指示站點配置檔案正在使用的後端,以及其它的後端設定。haystack——connections
是必需的設定,並且應該至少是以下的一種:
solr示例
haystack_connections = ,elasticsearch示例}
whoosh示例haystack_connections = ,
}
xapian示例#需要設定path到你的whoosh索引的檔案系統位置
import os
haystack_connections = ,}
# 自動更新索引
haystack_signal_processor = 'haystack.signals.realtimesignalprocessor'
檔案,檔名不能修改#首先安裝xapian後端(
#需要設定path到你的xapian索引的檔案系統位置。
import os
haystack_connections = ,
}
為什麼要建立索引?索引就像是一本書的目錄,可以為讀者提供更快速的導航與查詢。在這裡也是同樣的道理,當資料量非常大的時候,若要從這些資料裡找出所有的滿足搜尋條件的幾乎是不太可能的,將會給伺服器帶來極大的負擔。所以我們需要為指定的資料新增乙個索引(目錄),在這裡是為note建立乙個索引,索引的實現細節是我們不需要關心的,至於為它的哪些字段建立索引,怎麼指定 ,下面開始講解
每個索引裡面必須有且只能有乙個欄位為 document=true,這代表haystack 和搜尋引擎將使用此字段的內容作為索引進行檢索(primary field)。其他的字段只是附屬的屬性,方便呼叫,並不作為檢索資料
另外,我們在注意:如果使用乙個字段設定了document=true,則一般約定此欄位名為text,這是在articleindex類裡面一貫的命名,以防止後台混亂,當然名字你也可以隨便改,不過不建議改。
text
欄位上提供了use_template=true
。這允許我們使用乙個資料模板(而不是容易出錯的級聯)來構建文件搜尋引擎索引。你應該在模板目錄下建立新的模板search/indexes/blog/article_text.txt
,並將下面內容放在裡面。
這個資料模板的作用是對#在目錄「templates/search/indexes/應用名稱/」下建立「模型類名稱_text.txt」檔案}}
}
note.title
,note.user.get_full_name
,note.body
這三個字段建立索引,當檢索的時候會對這三個欄位做全文檢索匹配
在你的urlconf
中新增下面一行:
(r'^search/', include('haystack.urls')),這會拉取haystack的預設urlconf,它由單獨指向
searchview
例項的urlconf組成。你可以通過傳遞幾個關鍵引數或者完全重新它來改變這個類的行為。
你的搜尋模板(預設在search/search.html
)將可能非常簡單。下面的足夠讓你的搜尋執行(你的template/block
應該會不同)
需要注意的是doctype html>
title>
span.highlighted
style>
head>
搜尋結果如下:h3>
}
page.object_list
實際上是searchresult
物件的列表。這些物件返回索引的所有資料。它們可以通過}
來訪問。所以}
實際使用的是資料庫中article物件來訪問title
欄位的。
現在你已經配置好了所有的事情,是時候把資料庫中的資料放入索引了。haystack附帶的乙個命令列管理工具使它變得很容易。
簡單的執行./manage.py rebuild_index
。你會得到有多少模型進行了處理並放進索引的統計。
#建立chineseanalyzer.py檔案
#儲存在haystack的安裝資料夾下,路徑如「d:\python3\lib\site-packages\haystack\backends」
import jieba
from whoosh.analysis import tokenizer, token
class chinesetokenizer(tokenizer):
def __call__(self, value, positions=false, chars=false,
keeporiginal=false, removestops=true,
start_pos=0, start_char=0, mode='', **kwargs):
t = token(positions, chars, removestops=removestops, mode=mode,
**kwargs)
seglist = jieba.cut(value, cut_all=true)
for w in seglist:
t.original = t.text = w
t.boost = 1.0
if positions:
t.pos = start_pos + value.find(w)
if chars:
t.startchar = start_char + value.find(w)
t.endchar = start_char + value.find(w) + len(w)
yield t
def chineseanalyzer():
return chinesetokenizer()
#複製whoosh_backend.py檔案,改名為whoosh_cn_backend.py
#注意:複製出來的檔名,末尾會有乙個空格,記得要刪除這個空格
from .chineseanalyzer import chineseanalyzer
查詢analyzer=stemminganalyzer()
改為analyzer=chineseanalyzer()
form>
from haystack.views import searchview
from .models import *
class myseachview(searchview):
def extra_context(self): #過載extra_context來新增額外的context內容
context = super(myseachview,self).extra_context()
side_list = topic.objects.filter(kind='major').order_by('add_date')[:8]
context['side_list'] = side_list
return context
#路由修改
url(r'^search/', search_views.myseachview(), name='haystack_search'),
# 這裡可以限制最終}被高亮處理後的長度
#html中
span.highlighted
style>
Haystack搜尋框架
haystack是django的開源全文搜尋框架 全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率更高 該框架支援solr,elasticsearch,whoosh,xapian搜尋引擎它是乙個可插拔的後端 很像django的資料庫層 所以幾乎你所有寫的 都可以在不同搜尋引擎之間便捷切換 pip...
Django 框架15 全文搜尋
全文檢索 1.全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率更高,並且能夠對於中文進行分詞處理 2.haystack django的乙個包,可以方便地對model裡面的內容進行索引 搜尋,設計為支援whoosh,solr,xapian,elasticsearc四種全文檢索引擎後端,屬於一種全文...
使用全文搜尋
contains搜尋方式 1.簡單詞搜尋 搜尋乙個或多個特定的詞或短語。詞可以包括乙個或多個字元,中間沒有空格或標點。短語可以由空格分隔的多個詞組成,但詞之間可以有標點也可以沒標點 搜尋文章內容含有張三或者李四的記錄 select from article where contains articl...