Haystack 全文搜尋框架

2022-06-23 16:15:10 字數 4401 閱讀 8813

haystack是django的開源全文搜尋框架(全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率更高 ),該框架支援solr,elasticsearch,whoosh, **xapian

搜尋引擎它是一個可插拔的後端(很像django的資料庫層),所以幾乎你所有寫的**都可以在不同搜尋引擎之間便捷切換

pip install django-haystack

pip install whoosh

pip install jieba

跟大多數django的應用一樣,你應該在你的設定檔案(通常是settings.py. 示例:

在你的settings.py中,你需要新增一個設定來指示站點配置檔案正在使用的後端,以及其它的後端設定。haystack——connections是必需的設定,並且應該至少是以下的一種:

solr示例

haystack_connections = ,

}

elasticsearch示例

haystack_connections = ,

}

whoosh示例

#需要設定path到你的whoosh索引的檔案系統位置

import os

haystack_connections = ,}​

# 自動更新索引

haystack_signal_processor = 'haystack.signals.realtimesignalprocessor'

xapian示例

#首先安裝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 elast...

Django haystack實現全文搜尋

原文 project project settings py blog models py 此models py的內容假設如下 from d...