Loading

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
posted @ 2023-09-10 13:02  hkwJsxl  阅读(31)  评论(0编辑  收藏  举报