個人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的簡單方法html
另外Elasticsearch入門,我強烈推薦ElasticSearch學習搭建指南給你,很是想盡的入門指南手冊。java
前一段時間,我在Django項目上工做,想實現快速的自由文本搜索。我決定使用NoSQL數據庫,而不是使用常規數據庫來執行此搜索功能(例如MySQL或PostgreSQL)。那就是我發現ElasticSearch的時候。python
ElasticSearch爲您的數據索引文檔,而不是像常規關係數據庫那樣使用數據表。這樣能夠加快搜索速度,並提供其餘常規數據庫沒法得到的其餘好處。我還保留了一個常規的關係數據庫,用於存儲用戶詳細信息,登陸名和其餘不須要ElasticSearch索引的數據。shell
在搜索瞭如何使用Django正確實現ElasticSearch的很長時間以後,我並無真正找到使人滿意的答案。彷佛正在採起沒必要要的步驟來將數據索引到ElasticSearch中。有關如何執行搜索的信息不少,但有關如何完成索引的信息卻很少。我以爲那裏確定有一個更簡單的解決方案,因此我決定本身嘗試一下。數據庫
我想使它儘量簡單,由於在我看來,簡單的解決方案每每是最好的解決方案。KISS(保持簡單愚蠢),少便是多,全部這些東西都引發了個人共鳴,特別是當其餘解決方案很是複雜時。我決定在本視頻中使用HonzaKrál的示例來爲個人代碼提供基礎。我建議您觀看它,儘管此時它有點過期了。django
因爲我使用的是用Python編寫的Django,所以與ElasticSearch進行交互很是容易。有兩個客戶端庫可經過Python與ElasticSearch進行交互。有elasticsearch-py,這是官方的低級客戶端。還有elasticsearch-dsl,它是在前者的基礎上構建的,可是它提供了更高層次的抽象,但功能卻有所減小。segmentfault
咱們將很快討論一些示例,可是首先我須要闡明咱們要完成的工做:
● 在咱們的本地計算機上設置ElasticSearch並確保其正常運行
● 設置一個新的Django項目
● 批量索引數據庫中已經存在的數據
● 用戶保存到數據庫的每一個新實例的索引
● 基本搜索示例app
好吧,這彷佛很簡單。讓咱們開始在咱們的機器上安裝ElasticSearch。另外,全部代碼都將在個人GitHub上可用,所以您能夠輕鬆地遵循示例。
安裝ElasticSearch
因爲ElasticSearch在Java上運行,所以必須確保您具備更新的JVM版本。檢查
java -versioncurl
終端中的版本。而後運行如下命令來建立新目錄,下載,解壓縮並啓動ElasticSearch: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能夠作不少事情。我建議在他們的網站上閱讀並探索還有哪些其餘可能性,例如空間操做和帶有智能突出顯示的全文本搜索。它是一個很棒的工具,我必定會在之後的項目中使用它!若是您喜歡本文或有任何評論或建議,請隨時在下面留言。敬請期待更多有趣的東西!