個人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入門html
另外Elasticsearch入門,我強烈推薦ElasticSearch搭建手冊給你,很是想盡的入門指南手冊。python
在本文中,我將討論Elasticsearch以及如何將其與不一樣的Python應用程序集成。數據庫
什麼是ElasticSearch?json
ElasticSearch(ES)是基於Apache Lucene構建的分佈式且高度可用的開源搜索引擎。這是一個用Java構建的開源,所以可用於許多平臺。您以JSON格式存儲非結構化數據,這也使其成爲NoSQL數據庫。所以,與其餘NoSQL數據庫不一樣,ES還提供搜索引擎功能和其餘相關功能。segmentfault
ElasticSearch用例瀏覽器
您能夠將ES用於多種用途,下面提供了其中的幾個:架構
您正在運行的網站提供許多動態內容。不管是電子商務網站仍是博客。經過實施ES,您不只能夠爲您的Web應用程序提供強大的搜索引擎,還能夠在應用程序中提供本機自動完成功能。app
您能夠攝取不一樣種類的日誌數據,而後能夠用來查找趨勢和統計數據。curl
設置和運行
安裝ElasticSearch的最簡單方法是下載並運行可執行文件。您必須確保使用的是Java 7或更高版本。
下載後,解壓縮並運行其二進制文件。elasticsearch
elasticsearch-6.2.4 bin / elasticsearch
滾動窗口中將有不少文本。若是您看到相似下面的內容,則代表狀況已解決。
[2018-05-27T17:36:11,744] [INFO] [oehnNetty4HttpServerTransport] [c6hEGv4] publish_address {127.0.0.1:9200}、bound_addresses {[:: 1]:9200},{127.0.0.1:9200}
可是,既然眼見爲實,http://localhost:9200那就在瀏覽器中或經過cURL 訪問URL ,下面的內容應該會很歡迎您。
{
"name" : "c6hEGv4",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "HkRyTYXvSkGvkvHX2Q1-oQ",
"version" : {
"number" : "6.2.4", "build_hash" : "ccec39f", "build_date" : "2018-04-12T20:37:28.497551Z", "build_snapshot" : false, "lucene_version" : "7.2.1", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
如今,在我繼續使用Python訪問Elastic Search以前,讓咱們作一些基本的事情。正如我提到的,ES提供了REST API,咱們將使用它來執行不一樣的任務。
基本範例
您要作的第一件事就是建立一個 指數。一切都存儲在索引中。RDBMS至關於指數 是一個 數據庫 所以,請勿將其與您在RDBMS中學習的典型索引概念混淆。我正在使用PostMan運行REST API。
若是運行成功,您將在下面看到相似的響應。
{
「 acknowledged」:true, 「 shards_acknowledged」:true, 「 index」:「 company」
}
所以,咱們建立了一個名爲company的數據庫。換句話說,咱們建立了一個名爲company的索引。若是您經過瀏覽器進行訪問,則會看到相似如下內容:
http://localhost:9200/company { 「 company」:{ 「 aliases」:{ }, 「 mappings」:{ }, 「 settings」:{ 「 index」:{ 「 creation_date」:「 1527638692850」, 「 number_of_shards」:「 5」, 「 number_of_replicas」: 「 1」, 「 uuid」:「 RnT-gXISSxKchyowgjZOkQ」, 「 version」:{ 「 created」:「 6020499」 }, 「 provided_name」:「 company」 } } } }
稍等片刻mappings,咱們稍後再討論。實際上只不過是建立文檔的架構而已。creation_date是不言自明的。的number_of_shards講述,將讓這個數據分區的數量指標。將所有數據保存在單個磁盤上根本沒有任何意義。若是您正在運行包含多個Elastic節點的集羣,則整個數據將在它們之間拆分。簡而言之,若是有5個分片,則整個數據可在5個分片上使用,而且ElasticSearch集羣能夠處理來自其任何節點的請求。
副本談論數據的鏡像。若是您熟悉主從概念,那麼這對您來講應該不是新知識。您能夠在此處瞭解有關基本ES概念的更多信息。
建立索引的cURL版本是單行的。
➜elasticsearch-6.2.4 curl -X PUT本地主機:9200 / company {「 acknowledged」:true,「 shards_acknowledged」:true,「 index」:「 company」}%
您還能夠一次執行索引建立和記錄插入任務。您要作的就是以JSON格式傳遞記錄。在PostMan中,您能夠像下面這樣。
確保設置Content-Type爲application/json
company若是它不存在,它將在此處建立一個名爲的索引,而後在此處建立一個名爲employee的新類型。類型其實是RDBMS 中表的ES版本。
上面的請求將輸出如下JSON結構。
{ "_index": "company", "_type": "employees", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
您經過/1做爲記錄的ID。雖然沒有必要。要作的就是_id用value 設置field 1。而後,您以JSON格式傳遞數據,該數據最終將做爲新記錄或文檔插入。若是您http://localhost:9200/company/employees/1從瀏覽器訪問,您將看到如下內容。
{"_index":"company","_type":"employees","_id":"1","_version":1,"found":true,"_source":{ "name": "Adnan Siddiqi", "occupation": "Consultant" } }
您能夠看到實際記錄以及元數據。若是您願意,能夠將請求更改成http://localhost:9200/company/employees/1/_source,它將僅輸出記錄的JSON結構。
cURL版本爲:
{ "name" : "c6hEGv4", "cluster_name" : "elasticsearch", "cluster_uuid" : "HkRyTYXvSkGvkvHX2Q1-oQ", "version" : { "number" : "6.2.4", "build_hash" : "ccec39f", "build_date" : "2018-04-12T20:37:28.497551Z", "build_snapshot" : false, "lucene_version" : "7.2.1", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
若是您想更新該記錄怎麼辦?好吧,這很簡單。您要作的就是更改JSON記錄。以下所示:
它將生成如下輸出:
{ "company": { "aliases": { }, "mappings": { }, "settings": { "index": { "creation_date": "1527638692850", "number_of_shards": "5", "number_of_replicas": "1", "uuid": "RnT-gXISSxKchyowgjZOkQ", "version": { "created": "6020499" }, "provided_name": "company" } } } }
請注意,該_result字段如今設置爲updated而不是created
固然,您也能夠刪除某些記錄。
並且,若是您快要瘋了或者您的女友已經拋棄了您,則能夠經過curl -XDELETE localhost:9200/_all從命令行運行來燒燬整個世界。
讓咱們作一些基本的搜索。若是運行http://localhost:9200/company/employees/_search?q=adnan,它將搜索類型下的全部字段employees並返回相關記錄。
{ "_index": "company", "_type": "employees", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
該max_score字段指示記錄的相關性,即記錄的最高分數。若是有多個記錄,那麼它將是另外一個數字。
您還能夠經過傳遞字段名稱來將搜索條件限制爲某個字段。所以,http://localhost:9200/company/employees/_search?q=name:Adnan將僅在name文檔的字段中搜索。它實際上等效於SQLSELECT * from table where name='Adnan'
我只介紹了基本示例。ES能夠作不少事情,可是我將經過閱讀文檔讓您進一步探索它,而後切換到使用Python訪問ES。
在Python中訪問ElasticSearch
老實說,ES的REST API足夠好,您可使用requests庫來執行全部任務。不過,您能夠將Python庫用於ElasticSearch,以專一於主要任務,而沒必要擔憂如何建立請求。
經過pip安裝它,而後能夠在Python程序中訪問它。
pip install elasticsearch
爲確保已正確安裝,請從命令行運行如下基本代碼段:
➜elasticsearch-6.2.4 python
Python 3.6.4 | Anaconda自定義(64位)| (默認值,2018年1月16日,12:04:33)
在darwin上使用[GCC 4.2.1兼容的Clang 4.0.1(標籤/ RELEASE_401 / final)]輸入如下內容的
「幫助」,「版權」,「信用」或「許可證」更多信息。
➜ elasticsearch-6.2.4 python
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 12:04:33)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from elasticsearch import Elasticsearch >>> es = Elasticsearch([{'host': 'localhost', 'port': 9200}]) >>> es <Elasticsearch([{'host': 'localhost', 'port': 9200}])>
網頁搜索和Elasticsearch
讓咱們討論一下使用Elasticsearch的一些實際用例。目的是訪問在線食譜並將其存儲在Elasticsearch中以用於搜索和分析目的。咱們將首先從Allrecipes抓取數據並將其存儲在ES中。若是是ES,咱們還將建立一個嚴格的Schema或映射,以便確保以正確的格式和類型對數據進行索引。我只是拉沙拉食譜的清單而已。讓咱們開始!
抓取數據
結論Elasticsearch是一個功能強大的工具,經過提供強大的功能以返回最準確的結果集,能夠幫助您搜索現有或新應用。我剛剛介紹了要點。閱讀文檔並熟悉這個強大的工具。特別是模糊搜索功能很是出色。若是有機會,我將在之後的文章中介紹Query DSL。