haystack是django的開源全文搜尋框架(全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率更高 ),該框架支援solr,elasticsearch,whoosh, **xapian搜尋引擎它是乙個可插拔的後端(很像django的資料庫層),所以幾乎你所有寫的**都可以在不同搜尋引擎之間便捷切換
pip install django-haystack
pip install whoosh
pip install jieba
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
# 新增
'haystack',
'blog',
]在你的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 = ,
}
from haystack import indexes
class articleindex(indexes.searchindex, indexes.indexable):
#類名必須為需要檢索的model_name+index,這裡需要檢索article,所以建立articleindex
text = indexes.charfield(document=true, use_template=true)#建立乙個text欄位
#其它字段
desc = indexes.charfield(model_attr='desc')
content = indexes.charfield(model_attr='content')
def get_model(self):#過載get_model方法,必須要有!
return article
def index_queryset(self, using=none):
return self.get_model().objects.all()
為什麼要建立索引?索引就像是一本書的目錄,可以為讀者提供更快速的導航與查詢。在這裡也是同樣的道理,當資料量非常大的時候,若要從這些資料裡找出所有的滿足搜尋條件的幾乎是不太可能的,將會給伺服器帶來極大的負擔。所以我們需要為指定的資料新增乙個索引(目錄),在這裡是為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
應該會不同)
}#}
}
啥也沒找到
|
需要注意的是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()
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中
Haystack 全文搜尋框架
haystack是django的開源全文搜尋框架 全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率更高 該框架支援solr,elasticsearch,whoosh,xapian 搜尋引擎它是乙個可插拔的後端 很像django的資料庫層 所以幾乎你所有寫的 都可以在不同搜尋引擎之間便捷切換 pi...
搜尋總結 DFS BFS DBFS框架
注 此博文是在老師上課之後總結的,屬於課堂筆記,大部分摘自老師課件。盲目搜尋 按預定的控制策略進行搜尋,在搜尋過程中獲得的中間資訊不用來改進控制策略。1.廣度優先搜尋 breadth first search 2.深度優先搜尋 depth first search 3.純隨機搜尋 重覆式搜尋 迭代加...
Android開發 Android搜尋框架(二)
1.建立搜尋建議提供者 android已經為我們建立了乙個預設的,我們只需要繼承 searchrecentsuggestionprovider 就稍做修改就可以了。見 1 import android.content.searchrecentsuggestionsprovider 2 3 4 搜尋提...