Haystack接入Django-前后端不分离
我们在Django中可以通过使用Haystack来调用Elasticsearch搜索引擎。
Haystack安装
pip install django-haystack
pip install elasticsearch==2.4.1 # 要跟服务器启动的elasticsearch大版本一致,2.4.x
Haystack注册应用和路由
# 注册应用
INSTALLED_APPS = [
# ...
"haystack",
]
# 注册总路由
path("search/", include("haystack.urls")),
Haystack配置
# haystack连接elasticsearch的配置信息
HAYSTACK_CONNECTIONS = {
'default': {
# haystack操作es的核心模块
'ENGINE': 'haystack.backends.elasticsearch7_backend.Elasticsearch7SearchEngine',
# es服务端地址
'URL': 'http://127.0.0.1:9200/',
# es索引仓库
'INDEX_NAME': 'haystack',
},
}
# 当mysqlORM操作数据库改变时,自动更新es的索引,否则es的索引会找不到新增的数据
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
Haystack建立数据索引
通过创建索引类,来指明让搜索引擎对哪些字段建立索引,也就是可以通过哪些字段的关键字来检索数据。
在要应用全文检索的应用下新建search_indexes.py
文件,用于存放索引类,文件名不能更改。
serach_indexes.py
,以Course课程表为例。
from haystack import indexes
from .models import Course
class CourseIndex(indexes.SearchIndex, indexes.Indexable):
# 全文索引[可以根据配置,可以包括多个字段索引]
# document=True 表示当前字段为全文索引
# use_template=True 表示接下来haystack需要加载一个固定路径的html模板文件,让text与其他索引字段绑定映射关系
text = indexes.CharField(document=True, use_template=True)
# 下面的有需要的加,没需要的不用加
# 普通索引[单字段,只能提供单个字段值的搜索,所以此处的声明更主要是为了提供给上面的text全文索引使用的]
# es索引名 = indexes.索引数据类型(model_attr="ORM中的字段名")
id = indexes.IntegerField(model_attr="id")
name = indexes.CharField(model_attr="name")
description = indexes.CharField(model_attr="description")
teacher = indexes.CharField(model_attr="teacher__name")
course_cover = indexes.CharField(model_attr="course_cover")
get_level_display = indexes.CharField(model_attr="get_level_display")
students = indexes.IntegerField(model_attr="students")
get_status_display = indexes.CharField(model_attr="get_status_display")
lessons = indexes.IntegerField(model_attr="lessons")
pub_lessons = indexes.IntegerField(model_attr="pub_lessons")
price = indexes.DecimalField(model_attr="price")
discount = indexes.CharField(model_attr="discount_json")
orders = indexes.IntegerField(model_attr="orders")
credit = indexes.IntegerField(model_attr="credit")
# 指定与当前es索引模型对接的mysql的ORM模型
def get_model(self):
return Course
# 当用户搜索es索引时,对应的提供的mysql数据集有哪些?
def index_queryset(self, using=None):
return self.get_model().objects.filter(is_deleted=False, is_show=True)
Haystack创建text字段索引值模版文件
在模板文件下创建:templates/search/indexes/course/course_text.txt
。
注意:前三段是固定的;course_text.txt
中course就是ORM模型类名小写,text
就是es索引模型类中的全文索引字段名。
{{ object.name }}
{{ object.description }}
{{ object.teacher.name }}
{{ object.category.name }}
{{ object.diretion.name }}
手动构建es索引
如果此前mysql中已经有了部分的数据,而这部分数据在es中是没有创建索引,就需要先把之前的数据同步生成全文索引。在终端下执行以下命令
# 重建索引
python manage.py rebuild_index
# 更新索引
# python manage.py update_index --age=<num_hours>
# 删除索引
# python manage.py clear_index