您好,登錄后才能下訂單哦!
這篇文章主要講解了“Django對接elasticsearch怎么實現全文檢索”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Django對接elasticsearch怎么實現全文檢索”吧!
前言
第一步:首先安裝相關的依賴包
第二步:在django項目配置文件settings.py中注冊應用
第三步:在django項目配置文件settings.py中指定搜索的后端
第四步:創建索引類
第五步:在templates目錄中創建text字段使用的模板文件
第六步:手動更新索引
第七步:創建haystack序列化器
第八步:創建視圖類
第九步:添加路由
第十步:結果
說到搜索,第一時間想到的是mysql數據庫的like語句
但是,假如你的數據庫有幾千萬條數據,name字段沒有索引,可能查詢需要十幾分鐘,用戶可能會等你?那為什么不給name字段增加索引?數據表不僅僅是用來查詢,也會經常修改數據,新增刪除數據等。建立索引后,做增刪改操作時也會大大占用數據庫資源。所以應該怎么解決呢?
Elasticsearch!
一個強大的基于Lucene的全文搜索服務器!維基百科、Stack Overflow、Github都在用。
如果想詳細了解其原理的話,可以參考:https://www.elastic.co/guide/index.html
pip install drf-haystack pip install elasticsearch pip install djangorestframework
INSTALLED_APPS = [ 'app.apps.AppConfig', 'haystack', 'rest_framework' ]
HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE':'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://127.0.0.1:9200/', # 此處為elasticsearch運行的服務器ip地址,端口號固定為9200 'INDEX_NAME': 'test', # 指定elasticsearch建立的索引庫的名稱 }, } # 當添加、修改、刪除數據時,自動生成索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' # 指定搜索結果每頁的條數 # HAYSTACK_SEARCH_RESULTS_PER_PAGE = 1
在此之前要先創建model類,并插入數據
from django.db import models class Es(models.Model): name=models.CharField(max_length=32) desc=models.CharField(max_length=32)
在需要進行索引的應用的目錄下創建文件search_indexes.py, 在該文件內創建該索引類
我在app應用下創建:search_indexes.py
# 索引模型類的名稱必須是 模型類名稱 + Index from haystack import indexes from .models import Es class EsIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) def get_model(self): """返回建立索引的模型類""" return Es def index_queryset(self, using=None): """返回要建立索引的數據查詢集""" return self.get_model().objects.all()
創建文件templates/search/indexes/app/es_text.txt文件中定義
{{ object.name }} {{ object.desc }}
python manage.py rebuild_index #數據庫有多少條數據,全部會被同步到es中
from drf_haystack.serializers import HaystackSerializer from rest_framework.serializers import ModelSerializer from app import models from app.search_indexes import EsIndex class EsSerializer(ModelSerializer): class Meta: model=models.Es fields='__all__' class EsIndexSerializer(HaystackSerializer): object = EsSerializer(read_only=True) # 只讀,不可以進行反序列化 class Meta: index_classes = [EsIndex]# 索引類的名稱 fields = ('text', 'object')# text 由索引類進行返回, object 由序列化類進行返回,第一個參數必須是text
from drf_haystack.viewsets import HaystackViewSet from app.models import Book from app.serializers import EsIndexSerializer class EsSearchView(HaystackViewSet): index_models = [Es] serializer_class = EsIndexSerializer
from django.conf.urls import url from django.contrib import admin from rest_framework import routers from app.views import EsSearchView router = routers.DefaultRouter() router.register("book/search", EsSearchView, base_name="book-search") urlpatterns = [ url(r'^admin/', admin.site.urls), ] urlpatterns += router.urls
http://127.0.0.1:8000/?text=測試
感謝各位的閱讀,以上就是“Django對接elasticsearch怎么實現全文檢索”的內容了,經過本文的學習后,相信大家對Django對接elasticsearch怎么實現全文檢索這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。