Haystack为Django提供了模块化的搜索。它的特点是统一的,熟悉的API,可以让你在不修改代码的情况下使用不同的搜索后端(比如 Solr, Elasticsearch, Whoosh, Xapian 等等)。

drf-haystack是为了在REST framework中使用haystack而进行的封装(如果在Django中使用haystack,则安装django-haystack即可)。

settings.py
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://10.211.55.5:9200/', # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
'INDEX_NAME': 'meiduo', # 指定elasticsearch建立的索引库的名称,保存在elasticsearch镜像中
},
} # 当添加、修改、删除数据时,自动生成索引
#HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
是先注释掉的,在开发过程中,ip总是在变,搜索引擎是在docker中运行的,打开此设置的话,数据只要有变化就会自动生成索引,当ip变化时,就找不到了,将会报错。
当上线,ip固定再开启
创建search_indexes文件
from haystack import indexes
from goods.models import SKU class SKUIndex(indexes.SearchIndex,indexes.Indexable):
text = indexes.CharField(document=True,use_template=True)
#document=True为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) 在上架的商品
get_model就是SKU模型类
templates/search/indexes/goods/sku_text.txt模板文件

{{ object.name }}
{{ object.caption }}
{{ object.id }} 此模板指明当将关键词通过text参数名传递时,可以通过sku的name、caption、id来进行关键字索引查询。
视图
class SKUSearchView(HaystackViewSet): 继承自HaystackViewSet
index_models = [SKU] 指明索引模型类,注意 中括号
serializer_class = SKUSearchSerializer
pagination_class = PageNum 分页器类 序列化器
from rest_framework import serializers
from drf_haystack.serializers import HaystackSerializer from goods.models import SKU
from goods.search_indexes import SKUIndex class SKUSSerializers(serializers.ModelSerializer):
class Meta:
model = SKU
fields = '__all__' class SKUSearchSerializer(HaystackSerializer): 继承自haystack的序列化器类
object = SKUSSerializers(read_only=True)
class Meta:
index_classes=[SKUIndex]
fields=('text','object') 搜索视图使用SKUSearchSerializer序列化器来检查前端输入的参数text,并且检索出数据后使用这序列化器返回给前端。
SKUSearchSerializer 序列化器中的object字段使用来向前端返回数据时序列化的字段,
Haystack通过Elasticsearch检索出匹配关键词的搜索结果后,还会在数据库中取出完整的数据库模型类对象,放到搜索结果的object属性中,并将结果通过SKUIndexSerializer序列化器进行序列化。
我们可以通过声明搜索结果的object字段以SKUSerializer序列化的形式进行处理,明确要返回的搜索结果中每个数据对象包含哪些字段。

最新文章

  1. 使用HttpClient连接池进行https单双向验证
  2. mac的webdriver自动化
  3. Win7平台下Cocos2d-x环境搭建
  4. MySQL订单分库分表多维度查询
  5. ASP.NET MVC中的统一化自定义异常处理
  6. Linux的IO调度
  7. ASP.NET Web API 文件產生器 - 使用 Swagger
  8. 使用 PHP 读取文本(TXT)文件 并分页显示
  9. “jquery于each方法和选择”学习笔记
  10. C#读取XML方式
  11. vue-chat项目之重构与体验优化
  12. 最近最久未使用页面淘汰算法———LRU算法(java实现)
  13. spring源码分析之spring-jdbc模块详解
  14. CentOS7:ifconfig command not found解决
  15. leetcode 2. Add Two Numbers [java]
  16. Wireshark的简介
  17. Scrum立会报告+燃尽图(十月二十六日总第十七次)
  18. 404 Note Found· 第七次作业 - 需求分析报告
  19. 拦截器springmvc防止表单重复提交【3】3秒后自动跳回首页【重点明白如何跳转到各自需要的页面没有实现 但是有思路】
  20. jsp get 乱码

热门文章

  1. Java代码生成器Easy Code
  2. Linux进程间通信—使用共享内存
  3. netcore 版本升级 导致的cookie验证失败
  4. c# 基于RTMP推流 PC+移动端 拉流播放
  5. bootstrap 模态
  6. 查看MacOS中的Swift版本和SDK版本
  7. Java中BIO和NIO
  8. mtd交叉编译mkfs命令
  9. Linux环境下安装RabbitMQ
  10. Zabbix-报警之微信(Wechat alert)告警