Django中使用ElasticSearch

大雄45發表於2021-06-22
導讀 Elasticsearch可以使我們快速,近乎實時地儲存,搜尋和分析大量資料,並在幾毫秒內給出答覆。之所以能夠獲得快速的搜尋響應,是因為它可以直接搜尋索引,而不是直接搜尋文字。

Django中使用ElasticSearchDjango中使用ElasticSearch

什麼是Elasticsearch?

Elasticsearch是基於Lucene庫的搜尋引擎。它提供了具有HTTP Web介面和無模式JSON文件的分散式,多租戶功能的全文字搜尋引擎。Elasticsearch是用Java開發的。

Elasticsearch的用途是什麼?

Elasticsearch可以使我們快速,近乎實時地儲存,搜尋和分析大量資料,並在幾毫秒內給出答覆。之所以能夠獲得快速的搜尋響應,是因為它可以直接搜尋索引,而不是直接搜尋文字。

Elasticsearch-一些基本概念

索引—不同型別的文件和文件屬性的集合。例如,文件集可以包含社交網路應用程式的資料。

型別/對映-共享共享同一索引中存在的一組公共欄位的文件集合。例如,索引包含社交網路應用程式的資料;對於使用者個人資料資料,可以有一種特定的型別,對於訊息傳遞資料,可以有另一種型別,對於註釋資料,可以有另一種型別。

文件-以特定方式以JSON格式定義的欄位的集合。每個文件都屬於一種型別,並且位於索引內。每個文件都與唯一的識別符號(稱為UID)相關聯。

欄位-Elasticsearch欄位可以包含多個相同型別的值(本質上是一個列表)。另一方面,在SQL中,一列可以恰好包含所述型別的一個值。

在Django中使用Elasticsearch

安裝和配置,安裝Django Elasticsearch DSL:

$ pip install django-elasticsearch-dsl

然後將django_elasticsearch_dsl新增到INSTALLED_APPS

必須在django設定中定義ELASTICSEARCH_DSL。

例如:

ELASTICSEARCH_DSL={  
    'default': {  
        'hosts': 'localhost:9200'  
    },  
}

宣告要索引的資料,然後建立model:

# models.py  
class Category(models.Model):  
    name = models.CharField(max_length=30)  
    desc = models.CharField(max_length=100, blank=True)  
def __str__(self):  
    return '%s' % (self.name)  
要使該模型與Elasticsearch一起使用,請建立django_elasticsearch_dsl.Document的子類,在Document類中建立一個Index類以定義我們的Elasticsearch索引,名稱,設定等,最後使用Registry.register_document裝飾器註冊該類。它需要在應用目錄中的documents.py中定義Document類。 
# documents.py  
from django_elasticsearch_dsl import Document  
from django_elasticsearch_dsl.registries import registry  
from .models import Category  
@registry.register_document  
class CategoryDocument(Document):  
    class Index:  
        name = 'category'  
    settings = {  
        'number_of_shards': 1,  
        'number_of_replicas': 0  
    }  
    class Django:  
         model = Category  
         fields = [  
             'name',  
             'desc',  
         ]  
填充:  
要建立和填充Elasticsearch索引和對映,請使用search_index命令:  
$python manage.py search_index — rebuild  
要獲得更多幫助,請使用命令:  
$ python manage.py search_index —help  
現在,當執行以下操作時:  
category = Category(  
    name="Computer and Accessories",  
    desc="abc desc"  
)  
category.save()  
該物件也將儲存在Elasticsearch中(使用訊號處理程式)。  
搜尋:  
要獲取elasticsearch-dsl-py搜尋例項,請使用:  
s = CategoryDocument.search().filter("term", name="computer")  
# or  
s = CategoryDocument.search().query("match", description="abc")  
for hit in s:  
    print(  
        "Category name : {}, description {}".format(hit.name, hit.desc)  
    )  
要將彈性搜尋結果轉換為真實的Django查詢集,請注意,這會花費一個SQL請求來檢索具有由Elasticsearch查詢返回的ID的模型例項。  
s = CategoryDocument.search().filter("term", name="computer")[:30]  
qs = s.to_queryset()  
# qs is just a django queryset and it is called with order_by to keep  
# the same order as the elasticsearch result.  
for cat in qs:  
    print(cat.name)

完畢,如果有任何疑問,歡迎留言交流。

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2777802/,如需轉載,請註明出處,否則將追究法律責任。

相關文章