setting中注册
INSTALLED_APPS = [
....
# 全文检索(尽量放在最下方)
'haystack',
]
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://本机ip:9200/', # Elasticsearch服务器ip地址,端口号固定为9200
'INDEX_NAME': 'tenth_power', # Elasticsearch建立的索引库的名称
},
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# # 可以在 dev.py 中添加如下代码, 用于决定每页显示数据条数:
# HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
创建search_indexes.py文件(命名不能改变)
from haystack import indexes
from Headlines.models import Article
class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
"""文章索引模型类"""
text = indexes.CharField(document=True, use_template=True)
content = indexes.CharField(model_attr="content")
def get_model(self):
"""返回建立索引的模型类"""
return Article
def index_queryset(self, using=None):
"""返回要建立索引的数据查询集"""
return self.get_model().objects.all()
建立模板文件,这里article_text.txt(模型类名小写_text.txt)
views视图
from Headlines.serializers import SearchArticleIndexSerializer
from drf_haystack.viewsets import HaystackViewSet
# 搜索文章
class SearchArticleViewSet(HaystackViewSet):
# 权限:所有用户
# GET /articles/search/?text=<搜索关键字>
# 这里可以写多个模型,相应的:serializer里也可以写多个index_classes
index_models = [Article]
serializer_class = SearchArticleIndexSerializer
serializer.py序列化器文件中
from .models import Article
from drf_haystack import serializers as HSER
from .search_indexes import ArticleIndex
# 搜索文章序列化器类
class SearchArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
# 返回除了搜索字段外的所需要的其他字段数据, 可以将所有需要返回的字段数据写上,便于提取
fields = ('id', 'title', 'createtime')
# 搜索文章
class SearchArticleIndexSerializer(HSER.HaystackSerializer):
# 变量名称必须为 object 否则无法返回
object = SearchArticleSerializer(read_only=True)
class Meta:
index_classes = [ArticleIndex] # 索引类的名称,可以有多个
# text 由索引类进行返回, object 由序列化类进行返回,第一个参数必须是text
fields = ('text', 'object', 'content')
urls 路由配置文件
# 搜索文章路由
from rest_framework.routers import DefaultRouter
from Headlines.views import SearchArticleViewSet
router = DefaultRouter()
router.register(r'articles/search', SearchArticleViewSet, base_name='search')
urlpatterns += router.urls
最后建立索引
python manage.py rebuild_index