我的Elasticsearch系列文章,逐漸更新中,歡迎關注
0A.關於Elasticsearch及實例應用
00.Solr與ElasticSearch對比
01.ElasticSearch能做什么?
02.Elastic Stack功能介紹
03.如何安裝與設置Elasticsearch API
04.如果通過elasticsearch的head插件建立索引_CRUD操作
05.Elasticsearch多個實例和head plugin使用介紹
06.當Elasticsearch進行文檔索引時,它是怎樣工作的?
10.Kibana科普-作為Elasticsearhc開發工具
11.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" : false,
"lucene_version" : "6.3.0"
},
"tagline" : "You Know, for Search"
太好了,您現在已經在本地計算機上運行了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
文件中執行此操作:
from elasticsearch_dsl.connections import connections
connections.create_connection()
現在,您已經與ElasticSearch設置建立了全局連接,您需要定義要索引到其中的內容。編寫這段代碼:
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作品的包裝,讓你寫一個指數就像一個模型各字段,以便他們得到正確的格式,當他們得到索引。
在Meta內部,您告訴ElasticSearch您想要索引的名稱。這將是ElasticSearch的參考點,以便當在數據庫中初始化索引並保存每個創建的新對象實例時,它知道要處理的索引。
現在,您需要實際創建BlogPostIndex在ElasticSearch中新創建的映射。您可以執行此操作,還可以創建一種同時進行批量索引的方法-多么方便?
數據批量索引
該bulk命令位於該庫的頂部,因此elasticsearch.helpers安裝時包含該命令elasticsearch_dsl。在中執行以下操作search.py
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()))
“這里發生了什么?” 你可能在想。實際上,它並不那么復雜。
因為只要在我們的模型中進行某些更改,您就只想進行批量索引編制,因此可以將其映射到ElasticSearch中的模型。然后,您使用並將其實例傳遞給它將創建與ElasticSearch的連接。然后,您將生成器傳遞到常規數據庫中
所有BlogPost對象並對其進行迭代,並.indexing()在每個對象上調用方法。為什么要使用發電機?因為如果要在生成器上迭代的對象很多,則不必先將它們加載到內存中。
上面的代碼只有一個問題。您.indexing()的模型上還沒有方法。讓我們修復一下:
...
from .search import BlogPostIndex
......
# Add indexing method to 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()
return obj.to_dict(include_meta=True)
您將索引方法添加到BlogPost模型。它返回a BlogPostIndex並保存到ElasticSearch。
現在讓我們嘗試一下,看看是否可以對以前創建的博客文章進行批量索引。通過運行python manage.py shell你進入Django的殼並導入search.py用from elasticsearchapp.search import *,然后運行bulk_indexing()在你的數據庫索引的所有博客文章。要查看它是否有效,請運行以下curl命令:
curl -XGET'localhost:9200 / blogpost-index / blog_post_index / 1?pretty'
總結
這是一篇篇幅很長的文章,但我希望它寫得足夠簡單,即使是初學者也能理解。
我解釋了如何將Django模型連接到ElasticSearch進行索引和搜索,但是ElasticSearch可以做很多事情。我建議在他們的網站上閱讀並探索還有其他可能性,例如空間操作和帶有智能突出顯示的全文本搜索。它是一個很棒的工具,我一定會在以后的項目中使用它!