用es實現模糊搜索





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序列化的形式進行處理,明確要返回的搜索結果中每個數據對象包含哪些字段。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM