第15篇-使用Django進行ElasticSearch的簡單方法


我的Elasticsearch系列文章,逐漸更新中,歡迎關注
0A.關於Elasticsearch及實例應用
00.Solr與ElasticSearch對比
01.ElasticSearch能做什么?
02.Elastic Stack功能介紹
03.如何安裝與設置Elasticsearch API
04.如果通過elasticsearch的head插件建立索引_CRUD操作
05.Elasticsearch多個實例和head plugin使用介紹

06.當Elasticsearch進行文檔索引時,它是怎樣工作的?

07.Elasticsearch中的映射方式—簡潔版教程

08.Elasticsearch中的分析和分析器應用方式

09. Elasticsearch中構建自定義分析器

10.Kibana科普-作為Elasticsearhc開發工具
11.Elasticsearch查詢方法

12.Elasticsearch全文查詢

13.Elasticsearch查詢-術語級查詢

14.Python中的Elasticsearch入門

15.使用Django進行ElasticSearch的簡單方法

16.關於Elasticsearch的6件不太明顯的事情
17.使用Python的初學者Elasticsearch教程
18.用ElasticSearch索引MongoDB,一個簡單的自動完成索引項目
19.Kibana對Elasticsearch的實用介紹
20.不和諧如何索引數十億條消息
21.使用Django進行ElasticSearch的簡單方法

另外Elasticsearch入門,我強烈推薦ElasticSearch新手搭建手冊和這篇優秀的REST API設計指南 給你,這兩個指南都是非常想盡的入門手冊。

 

 

前一段時間,我在Django項目上工作,想實現快速的自由文本搜索。我決定使用NoSQL數據庫,而不是使用常規數據庫來執行此搜索功能(例如MySQL或PostgreSQL)。那就是我發現ElasticSearch的時候。

ElasticSearch為您的數據索引文檔,而不是像常規關系數據庫那樣使用數據表。這樣可以加快搜索速度,並提供其他常規數據庫無法獲得的其他好處。我還保留了一個常規的關系數據庫,用於存儲用戶詳細信息,登錄名和其他不需要ElasticSearch索引的數據。

在搜索了如何使用Django正確實現ElasticSearch的很長時間之后,我並沒有真正找到令人滿意的答案。似乎正在采取不必要的步驟來將數據索引到ElasticSearch中。有關如何執行搜索的信息很多,但有關如何完成索引的信息卻不多。我覺得那里肯定有一個更簡單的解決方案,所以我決定自己嘗試一下。

我想使它盡可能簡單,因為在我看來,簡單的解決方案往往是最好的解決方案。KISS(保持簡單愚蠢),少即是多,所有這些東西都引起了我的共鳴,特別是當其他解決方案非常復雜時。我決定在本視頻中使用HonzaKrál的示例來為我的代碼提供基礎。我建議您觀看它,盡管此時它有點過時了。

由於我使用的是用Python編寫的Django,因此與ElasticSearch進行交互非常容易。有兩個客戶端庫可通過Python與ElasticSearch進行交互。有elasticsearch-py,這是官方的低級客戶端。還有elasticsearch-dsl,它是在前者的基礎上構建的,但是它提供了更高層次的抽象,但功能卻有所減少。

我們將很快討論一些示例,但是首先我需要闡明我們要完成的工作:
● 在我們的本地計算機上設置ElasticSearch並確保其正常運行
● 設置一個新的Django項目
● 批量索引數據庫中已經存在的數據
● 用戶保存到數據庫的每個新實例的索引
● 基本搜索示例

好吧,這似乎很簡單。讓我們開始在我們的機器上安裝ElasticSearch。另外,所有代碼都將在我的GitHub上可用,因此您可以輕松地遵循示例。
安裝ElasticSearch
由於ElasticSearch在Java上運行,因此必須確保您具有更新的JVM版本。檢查
java -version

終端中的版本。然后運行以下命令來創建新目錄,下載,解壓縮並啟動ElasticSearch:

mkdir elasticsearch-examplewget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.tar.gztar -xzf elasticsearch-5.1.1.tar.gz./elasticsearch-5.1.1/bin/elasticsearch

當ElasticSearch啟動時,應該在終端窗口上打印很多輸出。要檢查其啟動和運行是否正確,請打開一個新的終端窗口並運行以下
curl

命令:
curl -XGET http:// localhost:9200

響應應該是這樣的:

{ name”:“ 6xIrzqq”, cluster_name ”:“ elasticsearch”,“ cluster_uuid”:“ eUH9REKyQOy4RKPzkuRI1g”, version”:{ number”:“ 5.1.1”, build_hash”:“ 5395e21”, build_date “:” 2016-12-06T12:36:15.409Z“, build_snapshot“:否, lucene_version“:” 6.3.0},

”標語“:”您知道,要搜索“太好了,您現在已經在本地計算機上運行了ElasticSearch!現在該設置您的Django項目了。
設置Django項目
首先,您要使用創建一個虛擬環境,
virtualenv venv

然后使用進行輸入,
source venv/bin/activate

以保留所有內容。然后安裝一些軟件包:

pip install django pip install elasticsearch-dsl要啟動一個新的Django項目,請運行: django-admin startproject elasticsearchproject cd  elasticsearchproject python manage.py startapp elasticsearchapp

創建新的Django項目后,您需要創建一個將要使用的模型。對於本指南,我選擇了一個很好的老式博客文章示例。在其中
models.py

放置以下代碼:

from django.db import models from django.utils import timezone from django.contrib.auth.models import User
Create your models here. Blogpost to be indexed into ElasticSearch class BlogPost(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blogpost') posted_date = models.DateField(default=timezone.now) title = models.CharField(max_length=200) text = models.TextField(max_length=1000)

到目前為止,還挺簡單的。不要忘記添加
elasticsearchapp


INSTALLED_APPS


settings.py

和注冊新的博文模型
admin.py

是這樣的:

from django.contrib import admin from .models import BlogPost Register your models here. Need to register my BlogPost so it shows up in the admin admin.site.register(BlogPost)

您還必須
python manage.py makemigrations,python manage.py migrate


python manage.py createsuperuser

創建數據庫和管理員帳戶。現在,
python manage.py runserver

轉到
http://localhost:8000/admin/

並登錄。現在,您應該可以在那里看到您的Blog帖子模型。繼續並在管理員中創建您的第一篇博客文章。
恭喜,您現在有了一個可正常運行的Django項目!終於是時候玩有趣的東西了–連接ElasticSearch。
將ElasticSearch與Django連接
首先,
search.py

在我們的
elasticsearchapp

目錄中創建一個新文件。這是ElasticSearch代碼的所在地。您在這里要做的第一件事是創建從Django應用程序到ElasticSearch的連接。您可以在
search.py

文件中執行此操作:
從 elasticsearch_dsl.connections 導入連接

connections.create_connection()

現在,您已經與ElasticSearch設置建立了全局連接,您需要定義要索引到其中的內容。編寫這段代碼:

from elasticsearch_dsl.connections import connections connections.create_connection() from elasticsearch_dsl.connections import connections from elasticsearch_dsl import DocType, Text, Date connections.create_connection() class BlogPostIndex(DocType): author = Text() posted_date = Date() title = Text() text = Text() class Meta: index = 'blogpost-index'

它看起來與您的模型非常相似,對吧?該
DocType

作品的包裝,讓你寫一個指數就像一個模型,並
Text


Date

各字段,以便他們得到正確的格式,當他們得到索引。
在Meta內部,您告訴ElasticSearch您希望索引被命名為什么。這將是ElasticSearch的參考點,以便當在數據庫中初始化索引並保存每個創建的新對象實例時,它知道要處理的索引。
現在,您需要實際創建
BlogPostIndex

在ElasticSearch中新創建的映射。您可以執行此操作,還可以創建一種同時進行批量索引的方法-多么方便?
數據批量索引

bulk

命令位於該庫的頂部,因此
elasticsearch.helpers

安裝時包含該命令
elasticsearch_dsl

。在中執行以下操作

from elasticsearch.helpers import bulk from elasticsearch import Elasticsearch from . import models ...... def bulk_indexing(): BlogPostIndex.init() es = Elasticsearch() bulk(client=es, actions=(b.indexing() for b in models.BlogPost.objects.all().iterator())) 

“這里發生了什么?” 你可能在想。實際上,它並不那么復雜。
因為只要在我們的模型中進行某些更改,您就只想進行批量索引
init()

編制,因此可以將其映射到ElasticSearch中的模型。然后,您使用
bulk

並將其傳遞給實例,
Elasticsearch()

該實例將創建與ElasticSearch的連接。然后,您將生成器傳遞給常規數據庫中
actions=

所有
BlogPost

對象並對其進行迭代,並
.indexing()

在每個對象上調用方法。為什么要使用發電機?因為如果要在生成器上迭代的對象很多,則不必先將它們加載到內存中。
上面的代碼只有一個問題。您
.indexing()

的模型上還沒有方法。讓我們修復一下:

#將索引方法添加到

BlogPost 
def indexing(self): obj = BlogPostIndex( meta = { 'id':self.id}, author = self.author.username, posted_date = self.posted_date, title = self.title , text = self.text ) obj.save()

返回 obj.to_dict(include_meta = True)您將索引方法添加到
BlogPost

模型。它返回a
BlogPostIndex

並保存到ElasticSearch。
現在讓我們嘗試一下,看看是否可以對以前創建的博客文章進行批量索引。通過運行,
python manage.py shell

您進入Django shell並使用導入您
search.py


from elasticsearchapp.search import *

,然后運行
bulk_indexing()

以索引數據庫中的所有博客文章。要查看它是否起作用,請運行以下curl命令:
curl -XGET'localhost:9200 / blogpost-index / blog_post_index / 1?pretty'您應該在終端上找回第一篇博客文章。
索引新保存的實例
接下來,您需要添加一個信號,以
.indexing()

在用戶每次保存新博客帖子時保存的每個新實例上觸發。在
elasticsearchapp

創建一個名為的新文件
signals.py

並添加以下代碼:
從 .models 導入博文
從 django.db.models.signals 進口 post_save
從 django.dispatch 進口接收機

@receiver(post_save,發件人=博客帖子)
DEF index_post(發件人,例如,** kwargs):

instance.indexing()該

post_save

信號將確保保存的實例在保存后將與該
.indexing()

方法建立索引。
為了使它起作用,我們還需要注冊我們正在使用信號的Django。我們首先打開
apps.py

並添加以下代碼:
從django.apps導入AppConfig

類ElasticsearchappConfig(AppConfig):

name =' elasticsearchapp'def ready(self): import elasticsearchapp.signals 

要完成此操作,我們還需要告訴Django我們正在使用此新配置。我們通過添加以下內容
__init__.py


elasticsearchapp

目錄內部執行此操作:
default_app_config ='elasticsearchapp.apps.ElasticsearchappConfig'現在,該

post_save

信號已在Django中注冊,並且隨時可以在保存新博客文章時收聽。
再次進入Django管理員並保存一個新博客,嘗試一下。然后使用
curl

命令檢查它是否已成功索引到ElasticSearch中。
簡單搜索
現在讓我們做一個簡單的搜索功能
search.py

來查找按作者過濾的所有帖子:

從 elasticsearch_dsl 導入 DocType,文本,日期,搜索
......
def search(author):

s = Search()。filter('term',author = author) response = s.execute() 返回響應讓我們嘗試搜索。在shell中:

from elasticsearchapp.search import *

並運行
print(search(author="<author name>"))

print(search(author="home"))
<Response: [<Result(blogpost-index/blog_post_index/1): {'text': 'Hello world, this is my first blog post', 'title':...}>]>

你有它!現在,您已成功將所有實例索引到ElasticSearch中,創建了一個
post_save

對每個新保存的實例進行索引的信號,並創建了一個函數來搜索我們的ElasticSearch數據庫中的數據。

結論
這是一篇篇幅很長的文章,但我希望它寫得足夠​​簡單,即使是初學者也能理解。

我解釋了如何將Django模型連接到ElasticSearch進行索引和搜索,但是ElasticSearch可以做很多事情。我建議在他們的網站上閱讀並探索還有哪些其他可能性,例如空間操作和帶有智能突出顯示的全文本搜索。它是一個很棒的工具,我一定會在以后的項目中使用它!
如果您喜歡本文或有任何評論或建議,請隨時在下面留言。敬請期待更多有趣的東西!


免責聲明!

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



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