当前位置:   article > 正文

Django-ES搜索-配置_django 配置es

django 配置es

商品搜索Elasticsearch(ES)

1.使用Docker安装Elasticsearch及其扩展

获取镜像,可以通过网络pull

docker image pull delron/elasticsearch-ik:2.4.6-1.0

或者加载提供给大家的镜像文件

docker load -i elasticsearch-ik-2.4.6_docker.tar

修改elasticsearch的配置文件 elasticsearc-2.4.6/config/elasticsearch.yml第54行,更改ip地址为本机ip地址

network.host:空格ip # 注意前面必须有空格 ifconfig查询ip

创建docker容器运行

docker run -dti --network=host --name=elasticsearch -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0

查看是否启动

在网址上输入:本地ip:9200 看是否有内容

2.使用haystack对接Elasticsearch

安装

  1. pip install drf-haystack
  2. pip install elasticsearch==2.4.1

注册应用

  1. INSTALLED_APPS = [
  2.   ...
  3.   'haystack',
  4.   ...
  5. ]

配置

在配置文件中配置haystack使用的搜索引擎后端

  1. # Haystack
  2. HAYSTACK_CONNECTIONS = {
  3.    'default': {
  4.        # 指定全文检索框架使用搜索引擎 Elasticsearch
  5.        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
  6.        'URL': 'http://172.16.179.139:9200/',  # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
  7.        'INDEX_NAME': 'meiduo_sh14',  # 指定elasticsearch建立的索引库的名称,数据库名
  8.   },
  9. }
  10. # 当添加、修改、删除数据时,自动生成索引
  11. HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

创建索引类

  1. # 在goods应用中新建search_indexes.py文件,用于存放索引类
  2. # 定义索引类
  3. from haystack import indexes
  4. from goods.models import SKU
  5. class SKUIndex(indexes.SearchIndex, indexes.Indexable):
  6.    """
  7.   商品模型索引类:
  8.   索引类名: <模型类>+Index
  9.   """
  10.    # document=True:说明text字段是索引字段
  11.    # use_template=True:说明索引字段中包含哪些内容会在一个文件中进行指定
  12.    text = indexes.CharField(document=True, use_template=True)
  13.    def get_model(self):
  14.        """返回索引类对应模型类"""
  15.        return SKU
  16.    def index_queryset(self, using=None):
  17.        """返回要建立索引数据的查询集"""
  18.        return self.get_model().objects.filter(is_launched=True)

在templates目录中创建text字段使用的模板文件

  1. # 具体在templates/search/indexes/goods/sku_text.txt文件中定义
  2. {{ object.name }}
  3. {{ object.caption }}
  4. {{ object.id }}  # object可以理解为模型类的对象,搜索时,可以根据这三个字段来搜索

手动生成初始索引

python manage.py rebuild_index

创建搜索视图集

  1. # goods/views.py
  2. from drf_haystack.viewsets import HaystackViewSet
  3. from goods.models import SKU
  4. from goods.serializers import SKUIndexSerializer
  5. class SKUSearchViewSet(HaystackViewSet):
  6.    """商品搜索视图集"""
  7.    # 指定索引模型类
  8.    index_models = [SKU]
  9.    # 指定搜索结果序列化时所使用的序列化器类
  10.    serializer_class = SKUIndexSerializer  # goods/serializers.py

创建搜索序列化器类

  1. # 在goods/serializers.py中创建haystack序列化器
  2. from rest_framework import serializers
  3. from drf_haystack.serializers import HaystackSerializer
  4. from goods.models import SKU
  5. from goods.search_indexes import SKUIndex
  6. class SKUSerializer(serializers.ModelSerializer):
  7.    """商品序列化器类"""
  8.    class Meta:
  9.        model = SKU
  10.        fields = ('id', 'name', 'price', 'default_image_url', 'comments')
  11. class SKUIndexSerializer(HaystackSerializer):
  12.    """
  13.   商品搜索结果序列化器类
  14.   """
  15.    # SKUIndexSerializer序列化器中的object字段是用来向前端返回数据时序列化的字段
  16.    object = SKUSerializer(read_only=True)  
  17.    
  18.    class Meta:
  19.        # 指定模型索引类
  20.        index_classes = [SKUIndex]  # goods/search_indexes.py
  21.        fields = ('text', 'object')  # objext为模型类的对象,text为

定义路由

  1. from django.conf.urls import url
  2. from rest_framework.routers import DefaultRouter
  3. urlpatterns = [ ]
  4. router = DefaultRouter()
  5. # 前缀
  6. router.register('skus/search', views.SKUSearchViewSet, base_name='skus_search')
  7. urlpatterns += router.urls

测试

我们可以GET方法访问如下链接进行测试,例如

  1. http://api.meiduo.site:8000/skus/search/?text=wifi
  2. # 该地址为项目配置好的地址,如果自己需要访问的话,在配置文件里配置一下
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/205589
推荐阅读
相关标签
  

闽ICP备14008679号