使用elasticsearch和django实现搜索功能

1.容器创建配置

sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0
sudo docker run -dit --network=host --name=elasticsearch -p 9200:9200 delron/elasticsearch-ik:2.4.6-1.0 -Des.network.publish_host="公网IP"

2.打开防火墙端口

打开防火墙9200端口

并访问公网IP:9200端口,如果正常,返回以下结果

3.django处理

haystack作为容器与数据之间的桥梁

下载haystack

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

setting配置

INSTALLED_APPS = [
    ...
    'haystack',
    ...
]
# Haystack
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://公网IP:9200/', # Elasticsearch服务器ip地址,端口号固定为9200
        'INDEX_NAME': 'matron_search', # Elasticsearch建立的索引库的名称, 可以任意起
    },
}
​
# elasticsearch每页数量 可设置
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5

创建search_indexes.py文件

在要查询的表对应的子项目底下创建search_indexes.py,以MatronInfo为例

from haystack import indexes
from .models import *
​
​
class MatronIndex(indexes.SearchIndex, indexes.Indexable):
    """索引数据模型类"""
    text = indexes.CharField(document=True, use_template=True)  # 必须要添加的document参数,后面是查询是否需要模板
    name = indexes.CharField(model_attr="name")
    serve_type = indexes.CharField(model_attr="serve_type")
    image_default = indexes.CharField(model_attr="image_default")
    department = indexes.CharField(model_attr="department")
    id = indexes.CharField(model_attr="pk")
    autocomplete = indexes.EdgeNgramField()
​
    def get_model(self):
        """返回建立索引的模型类"""
        return MatronsInfo  # 要查询的表对应的模型
​
    def index_queryset(self, using=None):
        """返回要建立索引的数据查询集"""
        # return self.get_model().objects.filter(serve_type=True)
        return self.get_model().objects.all()  # 返回的查询集,可用上面的条件查询结果 

创建查询实例

在如下图创建,不能缺少任何一层目录,txt文件命名格式是 需要查询的模型小写_text.txt

文件内容如下面格式,对应的属性是用来查询的字段

{{ object.name }}
{{ object.id }}
{{ object.price }}

手动生成索引

在manage.py同级目录运行下面命令

$ python manage.py rebuild_index

选择Y,出现一下结果说明成功

添加路由

在对应的子项目路由文件中添加,这里不同于其他的视图,不需要as_view()

urlpatterns = [
    path('api/', MySearchView()),
]

视图编写

from haystack.views import SearchView
from django.http import JsonResponse


class MySearchView(SearchView):
    '''重写SearchView类'''

    def create_response(self):
        """获取搜索结果"""
        context = self.get_context()  # 默认的获取返回结果的方法
        for MatronsInfo in context['page'].object_list:
            # 构造需要返回的结果
            print(MatronsInfo.object.id)
        count = context['page'].paginator.count
        # 拼接参数, 返回
        return_dict = {'code': 0,...}
        
        return JsonResponse(return_dict, safe=False)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值