django haystack實(shí)現(xiàn)全文檢索的示例代碼
全文檢索里的組件簡(jiǎn)介
1. 什么是haystack?
1. haystack是django的開源搜索框架,該框架支持Solr,Elasticsearch,Whoosh, *Xapian*搜索引擎,不用更改代碼,直接切換引擎,減少代碼量。
2. 搜索引擎使用Whoosh,這是一個(gè)由純Python實(shí)現(xiàn)的全文搜索引擎, 沒有二進(jìn)制文件等,比較小巧,配置比較簡(jiǎn)單,當(dāng)然性能自然略低。
3. 中文分詞Jieba,由于Whoosh自帶的是英文分詞,對(duì)中文的分詞支持不是太好,故用jieba替換whoosh的分詞組件
2. 什么是jieba?
很多的搜索引擎對(duì)中的支持不友好,jieba作為一個(gè)中文分詞器就是加強(qiáng)對(duì)中文的檢索功能
3. Whoosh是什么
1. Python的全文搜索庫(kù),Whoosh是索引文本及搜索文本的類和函數(shù)庫(kù)
2. Whoosh 自帶的是英文分詞,對(duì)中文分詞支持不太好,使用 jieba 替換 whoosh 的分詞組件。
haystack配置使用(前后端分離)
1. 安裝需要的包
pip3 install django-haystack pip3 install whoosh pip3 install jieba
2. 在setting.py中配置
'''注冊(cè)app '''
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# haystack要放在應(yīng)用的上面
'haystack',
'myapp', # 這個(gè)jsapp是自己創(chuàng)建的app
]
'''配置haystack '''
# 全文檢索框架配置
HAYSTACK_CONNECTIONS = {
'default': {
# 指定whoosh引擎
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
# 'ENGINE': 'myapp.whoosh_cn_backend.WhooshEngine', # whoosh_cn_backend是haystack的whoosh_backend.py改名的文件為了使用jieba分詞
# 索引文件路徑
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
# 添加此項(xiàng),當(dāng)數(shù)據(jù)庫(kù)改變時(shí),會(huì)自動(dòng)更新索引,非常方便
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
3. 定義數(shù)據(jù)庫(kù)
from django.db import models # Create your models here. class UserInfo(models.Model): name = models.CharField(max_length=254) age = models.IntegerField() class ArticlePost(models.Model): author = models.ForeignKey(UserInfo,on_delete=models.CASCADE) title = models.CharField(max_length=200) desc = models.SlugField(max_length=500) body = models.TextField()
索引文件生成
1. 在子應(yīng)用下創(chuàng)建索引文件
在子應(yīng)用的目錄下,創(chuàng)建一個(gè)名為 myapp/search_indexes.py 的文件
from haystack import indexes
from .models import ArticlePost
# 修改此處,類名為模型類的名稱+Index,比如模型類為GoodsInfo,則這里類名為GoodsInfoIndex(其實(shí)可以隨便寫)
class ArticlePostIndex(indexes.SearchIndex, indexes.Indexable):
# text為索引字段
# document = True,這代表haystack和搜索引擎將使用此字段的內(nèi)容作為索引進(jìn)行檢索
# use_template=True 指定根據(jù)表中的那些字段建立索引文件的說明放在一個(gè)文件中
text = indexes.CharField(document=True, use_template=True)
# 對(duì)那張表進(jìn)行查詢
def get_model(self): # 重載get_model方法,必須要有!
# 返回這個(gè)model
return ArticlePost
# 建立索引的數(shù)據(jù)
def index_queryset(self, using=None):
# 這個(gè)方法返回什么內(nèi)容,最終就會(huì)對(duì)那些方法建立索引,這里是對(duì)所有字段建立索引
return self.get_model().objects.all()
2.指定索引模板文件
創(chuàng)建文件路徑命名必須這個(gè)規(guī)范:templates/search/indexes/應(yīng)用名稱/模型類名稱_text.txt
如:
templates/search/indexes/myapp/articlepost_text.txt

{{ object.title }}
{{ object.author.name }}
{{ object.body }}
3.使用命令創(chuàng)建索引
python manage.py rebuild_index # 建立索引文件
替換成jieba分詞
1.將haystack源碼復(fù)制到項(xiàng)目中并改名
'''1.復(fù)制源碼中文件并改名 ''' 將 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ site-packages/haystack/backends/whoosh_backend.py文件復(fù)制到項(xiàng)目中 并將 whoosh_backend.py改名為 whoosh_cn_backend.py 放在APP中如: myapp\whoosh_cn_backend.py '''2.修改源碼中文件''' # 在全局引入的最后一行加入jieba分詞器 from jieba.analyse import ChineseAnalyzer # 修改為中文分詞法 查找 analyzer=StemmingAnalyzer() 改為 analyzer=ChineseAnalyzer()

索引文件使用
1. 編寫視圖
from django.shortcuts import render
# Create your views here.
import json
from django.conf import settings
from django.core.paginator import InvalidPage, Paginator
from django.http import Http404, HttpResponse,JsonResponse
from haystack.forms import ModelSearchForm
from haystack.query import EmptySearchQuerySet
RESULTS_PER_PAGE = getattr(settings, 'HAYSTACK_SEARCH_RESULTS_PER_PAGE', 20)
def basic_search(request, load_all=True, form_class=ModelSearchForm, searchqueryset=None, extra_context=None, results_per_page=None):
query = ''
results = EmptySearchQuerySet()
if request.GET.get('q'):
form = form_class(request.GET, searchqueryset=searchqueryset, load_all=load_all)
if form.is_valid():
query = form.cleaned_data['q']
results = form.search()
else:
form = form_class(searchqueryset=searchqueryset, load_all=load_all)
paginator = Paginator(results, results_per_page or RESULTS_PER_PAGE)
try:
page = paginator.page(int(request.GET.get('page', 1)))
except InvalidPage:
result = {"code": 404, "msg": 'No file found!', "data": []}
return HttpResponse(json.dumps(result), content_type="application/json")
context = {
'form': form,
'page': page,
'paginator': paginator,
'query': query,
'suggestion': None,
}
if results.query.backend.include_spelling:
context['suggestion'] = form.get_suggestion()
if extra_context:
context.update(extra_context)
jsondata = []
print(len(page.object_list))
for result in page.object_list:
data = {
'pk': result.object.pk,
'title': result.object.title,
'content': result.object.body,
}
jsondata.append(data)
result = {"code": 200, "msg": 'Search successfully!', "data": jsondata}
return JsonResponse(result, content_type="application/json")
到此這篇關(guān)于django haystack實(shí)現(xiàn)全文檢索的示例代碼的文章就介紹到這了,更多相關(guān)django haystack 全文檢索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用zhdate模塊實(shí)現(xiàn)農(nóng)歷日期處理
zhdate模塊統(tǒng)計(jì)從1900年到2100年的農(nóng)歷月份數(shù)據(jù)代碼,支持農(nóng)歷和公歷之間的轉(zhuǎn)化,并且支持日期差額運(yùn)算。本文將利用這一模塊實(shí)現(xiàn)農(nóng)歷日期的處理,需要的可以參考一下2022-03-03
jupyter 中文亂碼設(shè)置編碼格式 避免控制臺(tái)輸出的解決
這篇文章主要介紹了jupyter 中文亂碼設(shè)置編碼格式 避免控制臺(tái)輸出的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-04-04
基于Django框架的rest_framework的身份驗(yàn)證和權(quán)限解析
Django 是一個(gè)基于 Python 的 Web 框架,可讓您快速創(chuàng)建高效的 Web 應(yīng)用程序,這篇文章主要介紹了基于Django框架的rest_framework的身份驗(yàn)證和權(quán)限解析,需要的朋友可以參考下2023-05-05
python 實(shí)現(xiàn)多線程下載m3u8格式視頻并使用fmmpeg合并
這篇文章主要介紹了python 實(shí)現(xiàn)多線程下載m3u8格式視頻,使用fmmpeg合并的實(shí)例代碼,需要的朋友可以參考下2019-11-11
python將excel轉(zhuǎn)換為csv的代碼方法總結(jié)
在本篇文章里小編給大家分享了關(guān)于python如何將excel轉(zhuǎn)換為csv的實(shí)例方法和代碼內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-07-07
Python3.5 Json與pickle實(shí)現(xiàn)數(shù)據(jù)序列化與反序列化操作示例
這篇文章主要介紹了Python3.5 Json與pickle實(shí)現(xiàn)數(shù)據(jù)序列化與反序列化操作,結(jié)合實(shí)例形式分析了Python3.5使用Json與pickle模塊實(shí)現(xiàn)json格式數(shù)據(jù)的序列化及反序列化操作相關(guān)步驟與注意事項(xiàng),需要的朋友可以參考下2019-04-04
pytorch中的hook機(jī)制register_forward_hook
這篇文章主要介紹了pytorch中的hook機(jī)制register_forward_hook,手動(dòng)在forward之前注冊(cè)hook,hook在forward執(zhí)行以后被自動(dòng)執(zhí)行,下面詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下2022-03-03

