haystack全文检索框架
Haystack
1.什么是Haystack
Haystack是django的開源全文搜索框架(全文檢索不同于特定字段的模糊查詢,使用全文檢索的效率更高 ),該框架支持Solr,Elasticsearch,Whoosh,?**Xapian搜索引擎它是一個(gè)可插拔的后端(很像Django的數(shù)據(jù)庫層),所以幾乎你所有寫的代碼都可以在不同搜索引擎之間便捷切換
- 全文檢索不同于特定字段的模糊查詢,使用全文檢索的效率更高,并且能夠?qū)τ谥形倪M(jìn)行分詞處理
- haystack:django的一個(gè)包,可以方便地對(duì)model里面的內(nèi)容進(jìn)行索引、搜索,設(shè)計(jì)為支持whoosh,solr,Xapian,Elasticsearc四種全文檢索引擎后端,屬于一種全文檢索的框架
- whoosh:純Python編寫的全文搜索引擎,雖然性能比不上sphinx、xapian、Elasticsearc等,但是無二進(jìn)制包,程序不會(huì)莫名其妙的崩潰,對(duì)于小型的站點(diǎn),whoosh已經(jīng)足夠使用
- jieba:一款免費(fèi)的中文分詞包,如果覺得不好用可以使用一些收費(fèi)產(chǎn)品
2.安裝
pip install django-haystack
pip install whoosh
pip install jieba 3.配置
添加Haystack到INSTALLED_APPS
跟大多數(shù)Django的應(yīng)用一樣,你應(yīng)該在你的設(shè)置文件(通常是settings.py)添加Haystack到INSTALLED_APPS. 示例:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.sites',# 添加'haystack',# 你的app'blog',
] 修改settings.py
在你的settings.py中,你需要添加一個(gè)設(shè)置來指示站點(diǎn)配置文件正在使用的后端,以及其它的后端設(shè)置。 HAYSTACK——CONNECTIONS是必需的設(shè)置,并且應(yīng)該至少是以下的一種:
Solr示例
HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.solr_backend.SolrEngine','URL': 'http://127.0.0.1:8983/solr'# ...or for multicore...# 'URL': 'http://127.0.0.1:8983/solr/mysite',},
} Elasticsearch示例
HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine','URL': 'http://127.0.0.1:9200/','INDEX_NAME': 'haystack',},
} Whoosh示例
#需要設(shè)置PATH到你的Whoosh索引的文件系統(tǒng)位置
import os
HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine','PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),},
}# 自動(dòng)更新索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' Xapian示例
#首先安裝Xapian后端(http://github.com/notanumber/xapian-haystack/tree/master)
#需要設(shè)置PATH到你的Xapian索引的文件系統(tǒng)位置。
import os
HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'xapian_backend.XapianEngine','PATH': os.path.join(os.path.dirname(__file__), 'xapian_index'),},
} 4.處理數(shù)據(jù)
創(chuàng)建索引
如果你想針對(duì)某個(gè)app例如blog做全文檢索,則必須在blog的目錄下面建立search_indexes.py文件,文件名不能修改
from haystack import indexes
from app01.models import Articleclass ArticleIndex(indexes.SearchIndex, indexes.Indexable):#類名必須為需要檢索的Model_name+Index,這里需要檢索Article,所以創(chuàng)建ArticleIndextext = indexes.CharField(document=True, use_template=True)#創(chuàng)建一個(gè)text字段 #其它字段desc = indexes.CharField(model_attr='desc')content = indexes.CharField(model_attr='content')def get_model(self):#重載get_model方法,必須要有!return Articledef index_queryset(self, using=None):return self.get_model().objects.all() 為什么要?jiǎng)?chuàng)建索引?索引就像是一本書的目錄,可以為讀者提供更快速的導(dǎo)航與查找。在這里也是同樣的道理,當(dāng)數(shù)據(jù)量非常大的時(shí)候,若要從這些數(shù)據(jù)里找出所有的滿足搜索條件的幾乎是不太可能的,將會(huì)給服務(wù)器帶來極大的負(fù)擔(dān)。所以我們需要為指定的數(shù)據(jù)添加一個(gè)索引(目錄),在這里是為Note創(chuàng)建一個(gè)索引,索引的實(shí)現(xiàn)細(xì)節(jié)是我們不需要關(guān)心的,至于為它的哪些字段創(chuàng)建索引,怎么指定 ,下面開始講解
每個(gè)索引里面必須有且只能有一個(gè)字段為 document=True,這代表haystack 和搜索引擎將使用此字段的內(nèi)容作為索引進(jìn)行檢索(primary field)。其他的字段只是附屬的屬性,方便調(diào)用,并不作為檢索數(shù)據(jù)
注意:如果使用一個(gè)字段設(shè)置了document=True,則一般約定此字段名為text,這是在ArticleIndex類里面一貫的命名,以防止后臺(tái)混亂,當(dāng)然名字你也可以隨便改,不過不建議改。 另外,我們?cè)?code>text字段上提供了use_template=True。這允許我們使用一個(gè)數(shù)據(jù)模板(而不是容易出錯(cuò)的級(jí)聯(lián))來構(gòu)建文檔搜索引擎索引。你應(yīng)該在模板目錄下建立新的模板search/indexes/blog/article_text.txt,并將下面內(nèi)容放在里面。
#在目錄“templates/search/indexes/應(yīng)用名稱/”下創(chuàng)建“模型類名稱_text.txt”文件
{{ object.title }}
{{ object.desc }}
{{ object.content }} 這個(gè)數(shù)據(jù)模板的作用是對(duì)Note.title,?Note.user.get_full_name,Note.body這三個(gè)字段建立索引,當(dāng)檢索的時(shí)候會(huì)對(duì)這三個(gè)字段做全文檢索匹配
5.設(shè)置視圖
添加SearchView到你的URLconf
在你的URLconf中添加下面一行:
(r'^search/', include('haystack.urls')), 這會(huì)拉取Haystack的默認(rèn)URLconf,它由單獨(dú)指向SearchView實(shí)例的URLconf組成。你可以通過傳遞幾個(gè)關(guān)鍵參數(shù)或者完全重新它來改變這個(gè)類的行為。
搜索模板
你的搜索模板(默認(rèn)在search/search.html)將可能非常簡(jiǎn)單。下面的足夠讓你的搜索運(yùn)行(你的template/block應(yīng)該會(huì)不同)
<!DOCTYPE html>
<html>
<head><title></title><style>span.highlighted {color: red;}</style>
</head>
<body>
{% load highlight %}
{% if query %}<h3>搜索結(jié)果如下:</h3>{% for result in page.object_list %}
{# <a href="/{{ result.object.id }}/">{{ result.object.title }}</a><br/>#}<a href="/{{ result.object.id }}/">{% highlight result.object.title with query max_length 2%}</a><br/><p>{{ result.object.content|safe }}</p><p>{% highlight result.content with query %}</p>{% empty %}<p>啥也沒找到</p>{% endfor %}{% if page.has_previous or page.has_next %}<div>{% if page.has_previous %}<a href="?q={{ query }}&page={{ page.previous_page_number }}">{% endif %}« 上一頁{% if page.has_previous %}</a>{% endif %}|{% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}下一頁 »{% if page.has_next %}</a>{% endif %}</div>{% endif %}
{% endif %}
</body>
</html> 需要注意的是page.object_list實(shí)際上是SearchResult對(duì)象的列表。這些對(duì)象返回索引的所有數(shù)據(jù)。它們可以通過{{result.object}}來訪問。所以{{ result.object.title}}實(shí)際使用的是數(shù)據(jù)庫中Article對(duì)象來訪問title字段的。
重建索引
現(xiàn)在你已經(jīng)配置好了所有的事情,是時(shí)候把數(shù)據(jù)庫中的數(shù)據(jù)放入索引了。Haystack附帶的一個(gè)命令行管理工具使它變得很容易。
簡(jiǎn)單的運(yùn)行./manage.py rebuild_index。你會(huì)得到有多少模型進(jìn)行了處理并放進(jìn)索引的統(tǒng)計(jì)。
6.使用jieba分詞
#建立ChineseAnalyzer.py文件
#保存在haystack的安裝文件夾下,路徑如“D:\python3\Lib\site-packages\haystack\backends”import jieba
from whoosh.analysis import Tokenizer, Tokenclass 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 = wt.boost = 1.0if 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 tdef ChineseAnalyzer():return ChineseTokenizer()
#復(fù)制whoosh_backend.py文件,改名為whoosh_cn_backend.py
#注意:復(fù)制出來的文件名,末尾會(huì)有一個(gè)空格,記得要?jiǎng)h除這個(gè)空格
from .ChineseAnalyzer import ChineseAnalyzer
查找
analyzer=StemmingAnalyzer()
改為
analyzer=ChineseAnalyzer() 7.在模版中創(chuàng)建搜索欄
<form method='get' action="/search/" target="_blank"><input type="text" name="q"><input type="submit" value="查詢">
</form> 8.其它配置
增加更多變量
from haystack.views import SearchView
from .models import * class MySeachView(SearchView): def extra_context(self): #重載extra_context來添加額外的context內(nèi)容 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'), 高亮顯示
{% highlight result.summary with query %}
# 這里可以限制最終{{ result.summary }}被高亮處理后的長度
{% highlight result.summary with query max_length 40 %} #html中<style>span.highlighted {color: red;}</style>
轉(zhuǎn)載于:https://www.cnblogs.com/fuwei8086/p/11309611.html
總結(jié)
以上是生活随笔為你收集整理的haystack全文检索框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复制内容到剪切板
- 下一篇: Python记录-基础语法入门