Django+Docker搭建Elasticsearch全文檢索怎么做?詳細(xì)教程來了
Django + Docker完成es全文檢鎖
使用Docker安裝Elasticsearch
1.獲取Elasticsearch-ik鏡像
#從倉庫拉取鏡像 $ sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0 #解壓教學(xué)資料中本地鏡像 $ sudo docker load -i elasticsearch-ik-2.4.6_docker.tar
2.配置Elasticsearch-ik
將教學(xué)資料中的elasticsearc-2.4.6目錄拷貝到home目錄下。
修改/home/python/elasticsearc-2.4.6/config/elasticsearch.yml第54行。
更改ip地址為本機(jī)真實(shí)ip地址。

3.使用Docker運(yùn)行Elasticsearch-ik
$ sudo docker run -dti --name=elasticsearch --network=host -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0

Haystack介紹和安裝配置
1.Haystack介紹
Haystack 是在Django中對(duì)接搜索引擎的框架,搭建了用戶和搜索引擎之間的溝通橋梁。
我們在Django中可以通過使用 Haystack 來調(diào)用 Elasticsearch 搜索引擎。
Haystack 可以在不修改代碼的情況下使用不同的搜索后端(比如 Elasticsearch、Whoosh、Solr等等)。
2.Haystack安裝
$ pip install django-haystack $ pip install elasticsearch==2.4.1
3.Haystack注冊應(yīng)用和路由
# settings.py中配置
INSTALLED_APPS = [
'haystack', # 全文檢索
]
path('search/', include('haystack.urls')),
4.Haystack配置在配置文件中配置Haystack為搜索引擎后端
#Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://192.168.103.158:9200/', # Elasticsearch服務(wù)器ip地址,端口號(hào)固定為9200
'INDEX_NAME': 'meiduo_mall', # Elasticsearch建立的索引庫的名稱
},
}
#額外的配置,可加可以不加
#當(dāng)添加、修改、刪除數(shù)據(jù)時(shí),自動(dòng)生成索引
HAYSTACK_SIGNAL_PROCESSOR = ‘haystack.signals.RealtimeSignalProcessor'
重要提示:
HAYSTACK_SIGNAL_PROCESSOR 配置項(xiàng)保證了在Django運(yùn)行起來后,有新的數(shù)據(jù)產(chǎn)生時(shí),Haystack仍然可以讓Elasticsearch實(shí)時(shí)生成新數(shù)據(jù)的索引
Haystack建立數(shù)據(jù)索引
1.創(chuàng)建索引類
通過創(chuàng)建索引類,來指明讓搜索引擎對(duì)哪些字段建立索引,也就是可以通過哪些字段的關(guān)鍵字來檢索數(shù)據(jù)。
本項(xiàng)目中對(duì)SKU信息進(jìn)行全文檢索,所以在goods應(yīng)用中新建search_indexes.py文件(注意名字必須相同),用于存放索引類。
代碼:
from haystack import indexes from .models import 模型名稱 class 模型名稱Index(indexes.SearchIndex, indexes.Indexable): """模型名稱索引數(shù)據(jù)模型類""" text = indexes.CharField(document=True, use_template=True) def get_model(self): """返回建立索引的模型類""" return 模型名稱 def index_queryset(self, using=None): """返回要建立索引的數(shù)據(jù)查詢集""" return self.get_model().objects.filter(is_launched=True)
索引類SKUIndex說明:
在SKUIndex建立的字段,都可以借助Haystack由Elasticsearch搜索引擎查詢。
其中text字段我們聲明為document=True,表名該字段是主要進(jìn)行關(guān)鍵字查詢的字段。
text字段的索引值可以由多個(gè)數(shù)據(jù)庫模型類字段組成,具體由哪些模型類字段組成,我們用use_template=True表示后續(xù)通過模板來指明。
2.創(chuàng)建text字段索引值模板文件
在templates目錄中創(chuàng)建text字段使用的模板文件
具體在templates/search/indexes/goods/sku_text.txt文件(需要?jiǎng)?chuàng)建的文件夾,注意文件名相同)中定義
{{ object.id }}
{{ object.name }}
{{ object.caption }}模板文件說明:當(dāng)將關(guān)鍵詞通過text參數(shù)名傳遞時(shí)
此模板指明SKU的id、name、caption作為text字段的索引值來進(jìn)行關(guān)鍵字索引查詢。
3.手動(dòng)生成初始索引
#先再數(shù)據(jù)庫中添加數(shù)據(jù),再執(zhí)行生成索引
python manage.py rebuild_index
在view視圖中的實(shí)現(xiàn)es查詢的視圖
#調(diào)用時(shí)需要用get傳入q=查詢的內(nèi)容
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,
'desc': result.object.desc,
}
jsondata.append(data)
result = {"code": 200, "msg": 'Search successfully!', "data": jsondata}
return JsonResponse(result, content_type="application/json")
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Django中如何集成Elasticsearch實(shí)現(xiàn)強(qiáng)大全文搜索功能?
- 如何集成Elasticsearch到django restful
- Elasticsearches之python使用及Django與Flask集成示例
- 在Django中使用ElasticSearch
- Django對(duì)接elasticsearch實(shí)現(xiàn)全文檢索的示例代碼
- Django利用elasticsearch(搜索引擎)實(shí)現(xiàn)搜索功能
- Django項(xiàng)目之Elasticsearch搜索引擎的實(shí)例
- django使用haystack調(diào)用Elasticsearch實(shí)現(xiàn)索引搜索
相關(guān)文章
python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法
今天小編就為大家分享一篇python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
詳解Django中的ifequal和ifnotequal標(biāo)簽使用
這篇文章主要介紹了詳解Django中的ifequal和ifnotequal標(biāo)簽使用,Django是重多高人氣Python框架中最為著名的一個(gè),需要的朋友可以參考下2015-07-07
python定間隔取點(diǎn)(np.linspace)的實(shí)現(xiàn)
python 處理微信對(duì)賬單數(shù)據(jù)的實(shí)例代碼

