



Haystack為Django提供了模塊化的搜索。它的特點是統一的,熟悉的API,可以讓你在不修改代碼的情況下使用不同的搜索后端(比如 Solr, Elasticsearch, Whoosh, Xapian 等等)。
drf-haystack是為了在REST framework中使用haystack而進行的封裝(如果在Django中使用haystack,則安裝django-haystack即可)。
settings.py
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://10.211.55.5:9200/', # 此處為elasticsearch運行的服務器ip地址,端口號固定為9200
'INDEX_NAME': 'meiduo', # 指定elasticsearch建立的索引庫的名稱,保存在elasticsearch鏡像中
},
}
# 當添加、修改、刪除數據時,自動生成索引
#HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
是先注釋掉的,在開發過程中,ip總是在變,搜索引擎是在docker中運行的,打開此設置的話,數據只要有變化就會自動生成索引,當ip變化時,就找不到了,將會報錯。
當上線,ip固定再開啟
創建search_indexes文件
from haystack import indexes
from goods.models import SKU
class SKUIndex(indexes.SearchIndex,indexes.Indexable):
text = indexes.CharField(document=True,use_template=True)
#document=True為True意味着該字段是主要進行關鍵字查詢的字段,該字段的索引值可以由多個數據庫模型類字段組成,具體由哪些模型類字段組成,我們用use_template=True表示后續通過模板來指明
返回建立索引的模型類
def get_model(self):
return SKU
返回要建立索引的數據查詢集
def index_queryset(self, using=None):
return self.get_model().objects.filter(is_launched=True) 在上架的商品
get_model就是SKU模型類
templates/search/indexes/goods/sku_text.txt模板文件
{{ object.name }}
{{ object.caption }}
{{ object.id }}
此模板指明當將關鍵詞通過text參數名傳遞時,可以通過sku的name、caption、id來進行關鍵字索引查詢。
視圖
class SKUSearchView(HaystackViewSet): 繼承自HaystackViewSet
index_models = [SKU] 指明索引模型類,注意 中括號
serializer_class = SKUSearchSerializer
pagination_class = PageNum 分頁器類
序列化器
from rest_framework import serializers
from drf_haystack.serializers import HaystackSerializer
from goods.models import SKU
from goods.search_indexes import SKUIndex
class SKUSSerializers(serializers.ModelSerializer):
class Meta:
model = SKU
fields = '__all__'
class SKUSearchSerializer(HaystackSerializer): 繼承自haystack的序列化器類
object = SKUSSerializers(read_only=True)
class Meta:
index_classes=[SKUIndex]
fields=('text','object')
搜索視圖使用SKUSearchSerializer序列化器來檢查前端輸入的參數text,並且檢索出數據后使用這序列化器返回給前端。
SKUSearchSerializer 序列化器中的object字段使用來向前端返回數據時序列化的字段,
Haystack通過Elasticsearch檢索出匹配關鍵詞的搜索結果后,還會在數據庫中取出完整的數據庫模型類對象,放到搜索結果的object屬性中,並將結果通過SKUIndexSerializer序列化器進行序列化。
我們可以通過聲明搜索結果的object字段以SKUSerializer序列化的形式進行處理,明確要返回的搜索結果中每個數據對象包含哪些字段。
