Django REST Elasticsearch

基本用法

Django REST Elasticsearch提供了集成Django REST FrameworkElasticsearch的簡(jiǎn)便方法磷醋。該庫(kù)使用Elasticsearch DSL庫(kù)(elasticsearch-dsl-py)它是官方低級(jí)客戶端的高級(jí)庫(kù)。

讓我們看一下使用Django REST Elasticsearch構(gòu)建一個(gè)簡(jiǎn)單應(yīng)用程序的快速示例胡诗。在這個(gè)例子中邓线,我們將構(gòu)建一個(gè)簡(jiǎn)單的博客系統(tǒng)。

要求

  • Django REST Framework 3.5及更高版本
  • elasticsearch-dsl> = 5.0.0煌恢,<7.0.0(Elasticsearch 5.x)
安裝
pip install django-rest-elasticsearch
創(chuàng)建模型

首先骇陈,我們創(chuàng)建一個(gè)模型。

class Blog(models.Model):
    title = models.CharField(_('Title'), max_length=1000)
    created_at = models.DateTimeField(_('Created at'), auto_now_add=True)
    body = models.TextField(_('Body'))
    tags = ArrayField(models.CharField(max_length=200), blank=True, null=True)
    is_published = models.BooleanField(_('Is published'), default=False)

    def __str__(self):
        return self.title
在Elasticsearch中創(chuàng)建映射

然后瑰抵,我們必須圍繞我們的Django模型創(chuàng)建一個(gè)類似于模型的包裝器你雌。

class BlogIndex(DocType):

    pk = Integer()
    title = Text(fields={'raw': Keyword()})
    created_at = Date()
    body = Text()
    tags = Keyword(multi=True)
    is_published = Boolean()

    class Meta:
        index = 'blog'

我們需要在Elasticsearch中創(chuàng)建映射。為此二汛,您可以通過(guò)調(diào)用init類方法直接創(chuàng)建映射:

BlogIndex.init()

文檔生命周期文檔中婿崭,您可以找到有關(guān)如何手動(dòng)使用文檔的完整說(shuō)明。

添加肴颊,更新或刪除新數(shù)據(jù)時(shí)使索引可更新

我們希望在ElasticSearch中擁有一致的數(shù)據(jù)氓栈,這就是我們?cè)诟哪P椭械娜魏蝺?nèi)容時(shí)需要?jiǎng)?chuàng)建,更新或刪除文檔的原因苫昌。最好的方法是添加一個(gè)Django信號(hào)調(diào)度程序颤绕。在添加信號(hào)之前,讓我們創(chuàng)建一個(gè)序列化器來(lái)創(chuàng)建祟身,更新和刪除elasticsearch文檔奥务。

from rest_framework_elasticsearch.es_serializer import ElasticModelSerializer
from .models import Blog
from .search_indexes import BlogIndex

class ElasticBlogSerializer(ElasticModelSerializer):
    class Meta:
        model = Blog
        es_model = BlogIndex
        fields = ('pk', 'title', 'created_at', 'tags', 'body', 'is_published')

在我們需要?jiǎng)?chuàng)建signals.py文件并添加此代碼之后:

from django.db.models.signals import pre_save, post_delete
from django.dispatch import receiver
from .serializers import Blog, ElasticBlogSerializer

@receiver(pre_save, sender=Blog, dispatch_uid="update_record")
def update_es_record(sender, instance, **kwargs):
    obj = ElasticBlogSerializer(instance)
    obj.save()

@receiver(post_delete, sender=Blog, dispatch_uid="delete_record")
def delete_es_record(sender, instance, *args, **kwargs):
    obj = ElasticBlogSerializer(instance)
    obj.delete(ignore=404)
簡(jiǎn)單的django REST框架搜索視圖

最后,讓我們創(chuàng)建一個(gè)簡(jiǎn)單的搜索視圖袜硫,查找按標(biāo)簽過(guò)濾的所有帖子氯葬,并按標(biāo)題中的單詞進(jìn)行搜索:

from elasticsearch import Elasticsearch, RequestsHttpConnection
from rest_framework_elasticsearch import es_views, es_pagination, es_filters
from .search_indexes import BlogIndex

class BlogView(es_views.ListElasticAPIView):
    es_client = Elasticsearch(hosts=['elasticsearch:9200/'],
                              connection_class=RequestsHttpConnection)
    es_model = BlogIndex
    es_filter_backends = (
        es_filters.ElasticFieldsFilter,
        es_filters.ElasticSearchFilter
    )
    es_filter_fields = (
        es_filters.ESFieldFilter('tag', 'tags'),
    )
    es_search_fields = (
        'tags',
        'title',
    )

就是這樣,我們可以開(kāi)始使用它了婉陷。

http://example.com/blogs/api/list?search=elasticsearch
http://example.com/blogs/api/list?tag=opensource
http://example.com/blogs/api/list?tag=opensource,aws

分頁(yè)

分頁(yè)響應(yīng)的示例

class BlogView(es_views.ListElasticAPIView):
    es_client = Elasticsearch(hosts=['elasticsearch:9200/'],
                              connection_class=RequestsHttpConnection)

    es_pagination_class = es_pagination.ElasticLimitOffsetPagination

    es_model = BlogIndex
    es_filter_backends = (
        es_filters.ElasticFieldsFilter,
        es_filters.ElasticSearchFilter
    )
    es_filter_fields = (
        es_filters.ESFieldFilter('tag', 'tags'),
    )
    es_search_fields = (
        'tags',
        'title',
    )

排序

排序示例

class BlogView(es_views.ListElasticAPIView):
    es_client = Elasticsearch(hosts=['elasticsearch:9200/'],
                              connection_class=RequestsHttpConnection)

    es_pagination_class = es_pagination.ElasticLimitOffsetPagination

    es_filter_backends = (
        es_filters.ElasticFieldsFilter,
        es_filters.ElasticSearchFilter,
        es_filters.ElasticOrderingFilter,
    )
    es_ordering_fields = (
        "created_at",
        ("title.raw", "title")
    )
    es_filter_fields = (
        es_filters.ESFieldFilter('tag', 'tags'),
    )
    es_search_fields = (
        'tags',
        'title',
    )

https://github.com/myarik/django-rest-elasticsearch

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帚称,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秽澳,更是在濱河造成了極大的恐慌闯睹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件担神,死亡現(xiàn)場(chǎng)離奇詭異楼吃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)孩锡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)酷宵,“玉大人,你說(shuō)我怎么就攤上這事躬窜〗娇眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵荣挨,是天一觀的道長(zhǎng)男韧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)垦沉,這世上最難降的妖魔是什么煌抒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任仍劈,我火速辦了婚禮厕倍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贩疙。我一直安慰自己讹弯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布这溅。 她就那樣靜靜地躺著组民,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悲靴。 梳的紋絲不亂的頭發(fā)上臭胜,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音癞尚,去河邊找鬼耸三。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浇揩,可吹牛的內(nèi)容都是我干的仪壮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胳徽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼积锅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起养盗,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缚陷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后往核,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體箫爷,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝶缀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丹喻。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翁都,靈堂內(nèi)的尸體忽然破棺而出碍论,到底是詐尸還是另有隱情,我是刑警寧澤柄慰,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布鳍悠,位于F島的核電站,受9級(jí)特大地震影響坐搔,放射性物質(zhì)發(fā)生泄漏藏研。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一概行、第九天 我趴在偏房一處隱蔽的房頂上張望蠢挡。 院中可真熱鬧,春花似錦凳忙、人聲如沸业踏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勤家。三九已至,卻和暖如春柳恐,著一層夾襖步出監(jiān)牢的瞬間伐脖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工乐设, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讼庇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓伤提,卻偏偏與公主長(zhǎng)得像巫俺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肿男,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    小邁克閱讀 2,961評(píng)論 1 3
  • 2018年悄然過(guò)去介汹,在這臨近春節(jié)的日子,總有那么一些行業(yè)的人默默堅(jiān)守在工作的一線舶沛,他們工作辛苦嘹承,不遠(yuǎn)萬(wàn)里在祖國(guó)的另...
    抓住世界的尾巴閱讀 163評(píng)論 0 0
  • 今天 達(dá)武旦 一段舍不得 一個(gè)人走的旅程 提前走了—— 帶著你給我的 白色帆布袋 香薰和燈盞 ——《陰翳禮贊> 寫(xiě)...
    達(dá)武旦閱讀 98評(píng)論 0 1
  • 文 / 芹菜 今年國(guó)慶節(jié)后,我開(kāi)始密集的寫(xiě)作如庭。到今天叹卷,剛好40天,粗略的計(jì)算了一下,竟然寫(xiě)了8萬(wàn)字骤竹。有時(shí)一天三篇帝牡,...
    芹菜qincai閱讀 569評(píng)論 0 6
  • 背景:最近連續(xù)幾周被項(xiàng)目中的APNS實(shí)現(xiàn)所折騰,服務(wù)器和客戶端都存在坑蒙揣,服務(wù)器升級(jí)導(dǎo)致一堆bug靶溜,修復(fù)完后客戶端這...
    文藝氣息的工程師閱讀 357評(píng)論 0 0