• elasticsearch 索引的使用(配合haystack)


    1,# 从仓库拉取镜像
    $ sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0
    2,下载elasticsearc-2.4.6目录拷贝到home目录下。
    修改/home/python/elasticsearc-2.4.6/config/elasticsearch.yml第54行。
    更改 ip 地址为本机真实 ip 地址。
    3,使用docker运行Elasticsearch
    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
    4,
    $ pip install django-haystack
    $ pip install elasticsearch==2.4.1

    5.Haystack 注册应用和路由 (settings配置文件中)
    INSTALLED_APPS = [
    # 全文检索
    'haystack',
    ]
    # Haystack 注册
    url(r'^search/', include('haystack.urls')),

    6,在配置文件中配置 Haystack 为搜索引擎后端
    # Haystack
    HAYSTACK_CONNECTIONS = {
    'default': {
    'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
    'URL': 'http://172.16.238.128:9200/', # Elasticsearch服务器ip地址,端口号固定为9200
    'INDEX_NAME': 'meiduo_mall', # Elasticsearch建立的索引库的名称
    },
    }
    # 当添加、修改、删除数据时,自动生成索引
    HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor

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

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

    from haystack import indexes
    
    from .models import SKU
    
    class SKUIndex(indexes.SearchIndex, indexes.Indexable):
        """SKU索引数据模型类"""
        text = indexes.CharField(document=True, use_template=True)
    
        def get_model(self):
            """返回建立索引的模型类"""
            return SKU
    
        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字段的索引值来进行关键字索引查询。

    8,手动生成索引
    python manage.py rebuild_index

    9,测试索引
    .准备测试表单
    请求方法:GET
    请求地址:/search/
    请求参数:q
    在 goods.views.py 文件中添加如下代码:

    class MySearchView(SearchView):
        '''重写SearchView类'''
        def create_response(self):
            page = self.request.GET.get('page')
            # 获取搜索结果
            context = self.get_context()
            data_list = []
            for sku in context['page'].object_list:
                data_list.append({
                    'id':sku.object.id,
                    'name':sku.object.name,
                    'price':sku.object.price,
                    'default_image_url':sku.object.default_image_url,
                    'searchkey':context.get('query'),
                    'page_size':context['page'].paginator.num_pages,
                    'count':context['page'].paginator.count
                })
            # 拼接参数, 返回
            return http.JsonResponse(data_list, safe=False)


    路由配置,没有as_view()
    url(r'^search/$', views.MySearchView()),

    # 可以在 dev.py 中添加如下代码, 用于决定每页显示数据条数:
    HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5

  • 相关阅读:
    6th week blog3
    6th week blog2(颜色)
    6th week blog1(CSS单位)
    布局—一侧固定宽度,一侧自适应
    布局—两侧固定,中间自适应
    九宫格
    选项卡
    缓冲运动框架
    封装一些常用的js工具函数-不定时更新(希望大家积极留言,反馈bug^_^)
    在一定[min,max]区间,生成n个不重复的随机数的封装函数
  • 原文地址:https://www.cnblogs.com/wjun0/p/11817194.html
Copyright © 2020-2023  润新知