django haystack实现对多个模型类搜索

安装依赖

pip install django-haystack

1.在settings.py中配置

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://119.29.1xx.xxx:9200/',  # Elasticsearch服务器ip地址,端口号固定为9200
        'INDEX_NAME': 'courses',  # Elasticsearch建立的索引库的名称
        # 排除掉其他的索引模型
        'EXCLUDED_INDEXES': ['courses.search_indexes.TeacherIndex'],
    },
    'teachers': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://119.29.1xx.xxx:9200/',  # Elasticsearch服务器ip地址,端口号固定为9200
        'INDEX_NAME': 'teachers',  # Elasticsearch建立的索引库的名称
        # 排除掉其他的索引模型
        'EXCLUDED_INDEXES': ['courses.search_indexes.CourseIndex'],

    },

}

2.创建search_indexes.py

在每个app下创建search_indexes.py文件

2.1在app/courses/search_indexes.py

# 定义索引类
import haystack.views
from haystack import indexes
# 导入你的模型类
from apps.courses.models import Course
from apps.organizations.models import Teacher


# 指定对于某个类的某些数据建立索引
# 索引类名格式:模型类名+Index
class CourseIndex(indexes.SearchIndex, indexes.Indexable):
    # 索引字段 use_template=True指定根据表中的哪些字段建立索引文件的说明放在一个文件中
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        # 返回你的模型类
        return Course

    # 建立索引的数据
    def index_queryset(self, using=None):
        return self.get_model().objects.all()

2.2 在app/organizations/search_indexes.py

# 定义索引类
import haystack.views
from haystack import indexes
# 导入你的模型类
from apps.organizations.models import Teacher


# 指定对于某个类的某些数据建立索引
# 索引类名格式:模型类名+Index
class TeacherIndex(indexes.SearchIndex, indexes.Indexable):
    # 索引字段 use_template=True指定根据表中的哪些字段建立索引文件的说明放在一个文件中
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        # 返回你的模型类
        return Teacher

    # 建立索引的数据
    def index_queryset(self, using=None):
        return self.get_model().objects.all()

3.视图中自定义搜索模型

3.1 在app/courese/views.py

from haystack.views import SearchView


class CourseSearchView(SearchView):
    """My custom search view."""
    # 设置搜索模板
    template = 'search/search_courses.html'

    def __init__(self):
        from haystack.query import SearchQuerySet
        sqs = SearchQuerySet().using('default')
        super(CourseSearchView, self).__init__(searchqueryset=sqs)

    def get_query(self):
        queryset = super(CourseSearchView, self).get_query()
        # further filter queryset based on some set of criteria
        return queryset

    def get_results(self):
        res_list = []
        for search_obj in self.form.search():
            if search_obj.model_name == 'course':
                res_list.append(search_obj)

        return res_list

3.2在app/organizations/views.py

from haystack.views import SearchView


class TeacherSearchView(SearchView):
    """My custom search view."""
    template = 'search/search_teachers.html'

    def __init__(self):
        from haystack.query import SearchQuerySet
        sqs = SearchQuerySet().using('teachers')
        super(TeacherSearchView, self).__init__(searchqueryset=sqs)

    def get_query(self):
        queryset = super(TeacherSearchView, self).get_query()
        # further filter queryset based on some set of criteria
        return queryset

    def get_results(self):
        res_list = []
        for search_obj in self.form.search():
            if search_obj.model_name == 'teacher':
                res_list.append(search_obj)

        return res_list

4.配置路由

from django.conf.urls import url

from apps.courses.views import CourseSearchView
from apps.organizations.views import TeacherSearchView

urlpatterns = [
	...
    # 自定义全文检索框架
    url(r'^search/courses/?$', CourseSearchView()),
    url(r'^search/teachers/?$', TeacherSearchView()),
		...
]

5.定义查找字段

创建template/search/indexes/app名/模型类名小写_text.txt
在这里插入图片描述

6.生成索引

python manage.py rebuild_index

7.设置模板

模板所在位置应与视图中定义的templates路径一致

8.定义form表单

<form method="get" action="/search/teachers/">(这个接口应该动态变化)
	<input type="text" class="input_text fl" name="q" placeholder="请输入您要搜索的内容">
	<input type="submit" class="input_btn fr" name="" value="搜索" >
</form>
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值