安装依赖
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>