如何使用django來調用Elasticsearch實現全文的搜索
環境:django ==1.11.11
Haystack為Django提供了模塊化的搜索。它的特點是統一的,熟悉的API,可以讓你在不修改代碼的情況下使用不同的搜索后端(比如 Solr, Elasticsearch, Whoosh, Xapian 等等)。
1.首先安裝相關的依賴包:
pip install drf-haystack pip install elasticsearch==2.4.1
2. 在django項目配置文件中注冊應用:
INSTALLED_APPS = [ ... 'haystack', ... ]
3.在django項目配置文件中指定搜索的后端:
# Haystack HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://your_ip:9200/', # 此處為elasticsearch運行的服務器ip地址,端口號固定為9200 'INDEX_NAME': 'demo', # 指定elasticsearch建立的索引庫的名稱 }, } # 當添加、修改、刪除數據時,自動生成索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
4.創建索引類:
from haystack import indexes from .models import Demomodel class DemoIndex(indexes.SearchIndex, indexes.Indexable): """ 索引數據模型類 """ text = indexes.CharField(document=True, use_template=True) def get_model(self): """返回建立索引的模型類""" return Demomodel def index_queryset(self, using=None): """返回要建立索引的數據查詢集""" return self.get_model().objects.filter(is_launched=True) """ 說明:
在DemoIndex建立的字段,都可以借助haystack由elasticsearch搜索引擎查詢。 其中text字段聲明為document=True,表名該字段是主要進行關鍵字查詢的字段, 該字段的索引值可以由多個數據庫模型類字段組成,具體由哪些模型類字段組成,我們用use_template=True表示后續通過模板來指明。 在REST framework中,索引類的字段會作為查詢結果返回數據的來源 """
5. 在templates目錄中創建text字段使用的模板文件
templates/search/indexes/demo/demo_text.txt文件中定義
{{ object.name }} {{ object.id }}
6.創建haystack序列化器
from drf_haystack.serializers import HaystackSerializer class DemoSerializer(serializers.ModelSerializer): """ 序列化器 """ class Meta: model = Demo fields = ('id', 'name') class DemoIndexSerializer(HaystackSerializer): """ SKU索引結果數據序列化器 """ object = DemoSerializer(read_only=True) class Meta: index_classes = [DemoIndex] fields = ('text', 'object')
7.創建視圖
from drf_haystack.viewsets import HaystackViewSet class DemoSearchViewSet(HaystackViewSet): index_models = [Demo] serializer_class = DemoIndexSerializer
8. 添加路由,使用通過REST framework的router來定義路由
router = DefaultRouter() router.register('/', views.DemoSearchViewSet, base_name='demo_search') ... urlpatterns += router.urls
9.測試
http://127.0.0.1:8000/?text=something