Django + Docker完成es全文检锁

Django + Docker完成es全文检锁

使用Docker安装Elasticsearch
1.获取Elasticsearch-ik镜像
#从仓库拉取镜像
$ sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0
#解压教学资料中本地镜像
$ sudo docker load -i elasticsearch-ik-2.4.6_docker.tar

2.配置Elasticsearch-ik
将教学资料中的elasticsearc-2.4.6目录拷贝到home目录下。
修改/home/python/elasticsearc-2.4.6/config/elasticsearch.yml第54行。
更改ip地址为本机真实ip地址。
在这里插入图片描述

3.使用Docker运行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中对接搜索引擎的框架,搭建了用户和搜索引擎之间的沟通桥梁。
我们在Django中可以通过使用 Haystack 来调用 Elasticsearch 搜索引擎。
Haystack 可以在不修改代码的情况下使用不同的搜索后端(比如 Elasticsearch、Whoosh、Solr等等)。

2.Haystack安装

$ pip install django-haystack
$ pip install elasticsearch==2.4.1

3.Haystack注册应用和路由

# 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服务器ip地址,端口号固定为9200
        'INDEX_NAME': 'meiduo_mall', # Elasticsearch建立的索引库的名称
    },
}

#额外的配置,可加可以不加
#当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = ‘haystack.signals.RealtimeSignalProcessor’

重要提示:
HAYSTACK_SIGNAL_PROCESSOR 配置项保证了在Django运行起来后,有新的数据产生时,Haystack仍然可以让Elasticsearch实时生成新数据的索引

Haystack建立数据索引
1.创建索引类

通过创建索引类,来指明让搜索引擎对哪些字段建立索引,也就是可以通过哪些字段的关键字来检索数据。
本项目中对SKU信息进行全文检索,所以在goods应用中新建search_indexes.py文件(注意名字必须相同),用于存放索引类。
代码:

from haystack import indexes

from .models import  模型名称


class  模型名称Index(indexes.SearchIndex, indexes.Indexable):


 """模型名称索引数据模型类"""

 text = indexes.CharField(document=True, use_template=True)


 def get_model(self):

  """返回建立索引的模型类"""

return 模型名称


  def index_queryset(self, using=None):

  """返回要建立索引的数据查询集"""

 return self.get_model().objects.filter(is_launched=True)
  • 索引类SKUIndex说明:

  • 在SKUIndex建立的字段,都可以借助Haystack由Elasticsearch搜索引擎查询。

  • 其中text字段我们声明为document=True,表名该字段是主要进行关键字查询的字段。

  • text字段的索引值可以由多个数据库模型类字段组成,具体由哪些模型类字段组成,我们用use_template=True表示后续通过模板来指明。

2.创建text字段索引值模板文件

在templates目录中创建text字段使用的模板文件
具体在templates/search/indexes/goods/sku_text.txt文件(需要创建的文件夹,注意文件名相同)中定义
{{ object.id }}
{{ object.name }}
{{ object.caption }}

模板文件说明:当将关键词通过text参数名传递时
此模板指明SKU的id、name、caption作为text字段的索引值来进行关键字索引查询。
3.手动生成初始索引

#先再数据库中添加数据,再执行生成索引

python manage.py rebuild_index

在view视图中的实现es查询的视图

#调用时需要用get传入q=查询的内容
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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值