您好,登錄后才能下訂單哦!
這篇文章主要介紹“django怎么用分詞器實(shí)現(xiàn)站內(nèi)檢索功能”,在日常操作中,相信很多人在django怎么用分詞器實(shí)現(xiàn)站內(nèi)檢索功能問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”django怎么用分詞器實(shí)現(xiàn)站內(nèi)檢索功能”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
源碼
安裝庫(kù):
pip install django-haystack pip install whoosh pip install jieba
如果pip 安裝超時(shí),可配置pip國(guó)內(nèi)源下載,如下:
pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com <安裝的庫(kù)>
pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com django
如果安裝 django-haystack 失敗,先安裝 setuptools_scm .在安裝 django-haystack.
pip install setuptools_scm
創(chuàng)建項(xiàng)目demo:
# django-admin startproject <項(xiàng)目名> django-admin startproject find
切入demo 終端操作,創(chuàng)建app:
# python manage.py startapp <APP名> python manage.py startapp searchshop
在 settings.py 文件 中的 INSTALLED_APPS 配置 注入 剛才創(chuàng)建APP( 路徑: find/find/settings.py):
INSTALLED_APPS = [ ... 'searchshop', ... ]
在創(chuàng)建的APP中添加模型
models.py 文件添加如下(路徑: find/searchshop/models.py):
class Shopp(models.Model): shop_name = models.TextField(max_length=200) shop_price = models.IntegerField(default=0) shop_dsc = models.CharField(max_length=200)
在app 中admin.py文件注冊(cè)模型:
admin.py 文件添加如下(路徑: find/searchshop/admin.py):
from .models import Shopp admin.site.register(Shopp)
執(zhí)行命令,讓模型生效(修改模型時(shí),都要執(zhí)行一次,這樣模型才同步!!!):
python manage.py makemigrations python manage.py migrate
訪問(wèn)后臺(tái)可操作模型數(shù)據(jù):
python manage.py createsuperuser
運(yùn)行:
python manage.py runserver
訪問(wèn): http:127.0.0.1:8080/admin 登錄剛才設(shè)置帳號(hào),密碼即可進(jìn)入:
配置 haystack
在 settings.py 文件 中的 INSTALLED_APPS 配置最底部 注入 haystack( 路徑: find/find/settings.py):
INSTALLED_APPS = [ ... 'haystack' ]
在app內(nèi),添加 search_indexes.py (目錄:find/searchshop/search_indexes.py):
from haystack import indexes from .models import Shopp # 之前創(chuàng)建的模型 # 修改此處,類名為模型類的名稱+Index,比如模型類為GoodsInfo,則這里類名為GoodsInfoIndex(其實(shí)可以隨便寫) class ArticlePostIndex(indexes.SearchIndex, indexes.Indexable): # text為索引字段 # document = True,這代表haystack和搜索引擎將使用此字段的內(nèi)容作為索引進(jìn)行檢索 # use_template=True 指定根據(jù)表中的那些字段建立索引文件的說(shuō)明放在一個(gè)文件中 text = indexes.CharField(document=True, use_template=True) # 對(duì)那張表進(jìn)行查詢 def get_model(self): # 重載get_model方法,必須要有! # 返回這個(gè)model return Shopp # 建立索引的數(shù)據(jù) def index_queryset(self, using=None): # 這個(gè)方法返回什么內(nèi)容,最終就會(huì)對(duì)那些方法建立索引,這里是對(duì)所有字段建立索引 return self.get_model().objects.all()
生成檢索索引
python manage.py rebuild_index
項(xiàng)目目錄多出whoosh_index文件夾.
修改分詞器
從 pyrhon 安裝路徑 ( \Lib\site-packages\haystack\backends\whoosh_backend.py) 復(fù)制一份到app中改名為 whoosh_cn_backend (find/searchshop/whoosh_cn_backend.py)
在頂部引用:
from jieba.analyse import ChineseAnalyzer
找到 (查找 StemmingAnalyzer ) 位置:
schema_fields[field_class.index_fieldname] = TEXT( stored=True, analyzer=StemmingAnalyzer(), field_boost=field_class.boost, sortable=True, )
替換:
schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(), field_boost=field_class.boost)
在 INSTALLED_APPS(路徑: find/find/settings.py) 配置后面 后面添加:
HAYSTACK_CONNECTIONS = { 'default': { # 指定whoosh引擎 (之前創(chuàng)建的whoosh_cn_backend) 'ENGINE': 'searchshop.whoosh_cn_backend.WhooshEngine', # 'ENGINE': 'jsapp.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'
添加 templates
在APP中創(chuàng)建 templates文件夾.
添加內(nèi)容檢索內(nèi)容
在templates文件夾下創(chuàng)建文件夾 search -> indexes -> searchshop( search + APP名);
路徑( 目錄: find/searchshop\templates\search\indexes\searchshop) 添加Shopp_text.txt(APP名_text.txt): (需要檢索的字段名)
{{object.shop_name}} {{object.shop_dsc}} {{object.shop_price}}
添加頁(yè)面模板
在templates文件夾下創(chuàng)建文件夾(searchshop) 下創(chuàng)建index.html:
{% load highlight %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>商品列表</title> <style> span.highlighted { color: red; } </style> </head> <body> <div class="search"> <form method="get" action="{% url 'shop:search' %}"> <input type="text" name="q" placeholder="a搜索商品"> <input type="submit" value="搜索"> </form> </div> {% if shop_list and query %} <ul> {% for question in shop_list %} <li> {% highlight question.object.shop_name with query %} 價(jià)格: {% highlight question.object.shop_price with query %} <span class="post-author"> <a> {% highlight question.object.shop_dsc with query %} </a></span> </li> {% endfor %} </ul> {% else %} <p>No polls are available.</p> {% endif %} </body> </html>
load highlight : 加載高亮.
query : 檢索詞
shop_list : 檢索結(jié)果
目錄: find/searchshop/views.py
from django.shortcuts import render from django.http import HttpResponse #Create your views here. from .models import Shopp from haystack.forms import ModelSearchForm from haystack.query import EmptySearchQuerySet def index(request): shop_list = Shopp.objects.all() context = { 'query': '', 'shop_list': shop_list } return render(request, 'searchshop/index.html', context) def search(request, load_all=True, form_class=ModelSearchForm, searchqueryset=None): 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() context = { 'query': query, 'shop_list': results } return render(request, 'searchshop/index.html', context) # results = form.search() return HttpResponse(request.GET.get('q')) return HttpResponse('查詢')
在 find/searchshop 創(chuàng)建 urls.py
from . import views app_name = 'shop' # 重點(diǎn)是這一行 urlpatterns = [ path('', views.index, name='index'), path('search', views.search, name='search'), # path(r'search/$', views.search, name='search') ]
修改 urls.py(目錄: find/find/urls.py)
from django.urls import path, include urlpatterns = [ path('shop', include('searchshop.urls')), path('admin/', admin.site.urls), ]
運(yùn)行:
python manage.py runserver
測(cè)試
http://127.0.0.1:8000/shop
所以'紅米'查詢不到…
到此,關(guān)于“django怎么用分詞器實(shí)現(xiàn)站內(nèi)檢索功能”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。