1. 程式人生 > 程式設計 >django haystack實現全文檢索的示例程式碼

django haystack實現全文檢索的示例程式碼

全文檢索裡的元件簡介

1. 什麼是haystack?

1. haystack是django的開源搜尋框架,該框架支援Solr,Elasticsearch,Whoosh,*Xapian*搜尋引擎,不用更改程式碼,直接切換引擎,減少程式碼量。

2. 搜尋引擎使用Whoosh,這是一個由純Python實現的全文搜尋引擎, 沒有二進位制檔案等,比較小巧,配置比較簡單,當然效能自然略低。

3. 中文分詞Jieba,由於Whoosh自帶的是英文分詞,對中文的分詞支援不是太好,故用jieba替換whoosh的分片語件

2. 什麼是jieba?

很多的搜尋引擎對中的支援不友好,jieba作為一箇中文分詞器就是加強對中文的檢索功能

3. Whoosh是什麼

1. Python的全文搜尋庫,Whoosh是索引文字及搜尋文字的類和函式庫

2. Whoosh 自帶的是英文分詞,對中文分詞支援不太好,使用 jieba 替換 whoosh 的分片語件。

haystack配置使用(前後端分離)

1. 安裝需要的包

pip3 install django-haystack
pip3 install whoosh
pip3 install jieba

2. 在setting.py中配置

'''註冊app '''
INSTALLED_APPS = [
  'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',# haystack要放在應用的上面
  'haystack','myapp',# 這個jsapp是自己建立的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'),}
}
# 新增此項,當資料庫改變時,會自動更新索引,非常方便
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

3. 定義資料庫

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. 在子應用下建立索引檔案

在子應用的目錄下,建立一個名為 myapp/search_indexes.py 的檔案

from haystack import indexes
from .models import ArticlePost

# 修改此處,類名為模型類的名稱+Index,比如模型類為GoodsInfo,則這裡類名為GoodsInfoIndex(其實可以隨便寫)
class ArticlePostIndex(indexes.SearchIndex,indexes.Indexable):
  # text為索引欄位
  # document = True,這代表haystack和搜尋引擎將使用此欄位的內容作為索引進行檢索
  # use_template=True 指定根據表中的那些欄位建立索引檔案的說明放在一個檔案中
  text = indexes.CharField(document=True,use_template=True)

  # 對那張表進行查詢
  def get_model(self): # 過載get_model方法,必須要有!
    # 返回這個model
    return ArticlePost

  # 建立索引的資料
  def index_queryset(self,using=None):
    # 這個方法返回什麼內容,最終就會對那些方法建立索引,這裡是對所有欄位建立索引
    return self.get_model().objects.all()

2.指定索引模板檔案

建立檔案路徑命名必須這個規範:templates/search/indexes/應用名稱/模型類名稱_text.txt
如:
templates/search/indexes/myapp/articlepost_text.txt

django haystack實現全文檢索的示例程式碼

{{ object.title }}
{{ object.author.name }}
{{ object.body }}

3.使用命令建立索引

python manage.py rebuild_index # 建立索引檔案

替換成jieba分詞

1.將haystack原始碼複製到專案中並改名

'''1.複製原始碼中檔案並改名 '''
將 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/
site-packages/haystack/backends/whoosh_backend.py檔案複製到專案中
並將 whoosh_backend.py改名為 whoosh_cn_backend.py 放在APP中如:
myapp\whoosh_cn_backend.py

'''2.修改原始碼中檔案'''
# 在全域性引入的最後一行加入jieba分詞器
from jieba.analyse import ChineseAnalyzer

# 修改為中文分詞法
查詢
analyzer=StemmingAnalyzer()
改為
analyzer=ChineseAnalyzer()

django haystack實現全文檢索的示例程式碼

索引檔案使用

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")

到此這篇關於django haystack實現全文檢索的示例程式碼的文章就介紹到這了,更多相關django haystack 全文檢索內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!