第14篇-Python中的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入門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。

相關文章
相關標籤/搜索