ElasticSearch的入門(一)

ElasticSearch的基礎入門

ElasticSearch是什麼

  • 基於Apache Lucene構建的開源搜索引擎node

  • 採用Java編寫,提供了簡單易用的RESTFul API數據庫

  • 輕鬆的橫向拓展,可支持PB級的結構化和非結構化的數據處理數據結構

使用場景

  • 海量數據分析引擎curl

  • 站內搜索引擎jvm

  • 數據倉庫搜索引擎

與ElasticSearch交互

與Elaticsearch交互取決因而否使用Java Java API Elasticsearch爲Java用戶提供了兩種內置客戶端url

節點客戶端

節點客戶端以無數據節點(none data node)身份加入集羣,它本身不存儲任何數據,可是它知道數據在集羣中的具體位置,而且可以直接妝發請求到對應的節點間上。spa

傳輸客戶端

更輕量的傳輸客戶端可以發生請求到遠程集羣。它本身不加入集羣,只是簡單轉發請求給集羣中的節點。3d

節點客戶端和傳輸客戶端都是經過9300端口與集羣交互的,使用Elasticsearch傳輸協議。集羣中的節點之間也是經過9300端口進行通訊的。若是這個端口沒有開放,你的節點將沒法組成集羣。代理

注意:

Java客戶端所在的Elasticsearch版本必須與集羣中其餘節點一致,不然,它們可能互相 沒法識別。

基於HTTP協議,以JSON數據格式的RESTful API的交互方式

其餘的全部成勳語言均可以i使用RESTful API,經過9200端口與Elasticsearch進行通訊,可使用WEB客戶端,甚至可使用curl命令與Elasticsearch通訊

向Elasticsearch發出的請求的組成部分與其它普通的HTTP請求是同樣的:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
複製代碼
  • VERB HTTP方法: GET , POST , PUT , HEAD , DELETE

  • PROTOCOL http或者https協議(只有在Elasticsearch前面有https代理的時候可用)

  • HOST Elasticsearch集羣中的任何一個節點的主機名,若是是在本地的節點,那麼就叫 localhos

  • PORT Elasticsearch HTTP服務所在的端口,默認爲9200

  • PATH API路徑(例如_count將返回集羣中文檔的數量),PATH能夠包含多個組件,例如 _cluster/stats或者_nodes/stats/jvm

  • QUERY_STRING 一些可選的查詢請求參數,例如 ?pretty 參數將使請求返回更加美觀 易讀的JSON數據

  • BODY 一個JSON格式的請求主體(若是請求須要的話)

Elasticsearch的存儲的概念

與傳統的數據庫的存儲方式不一樣,Elasticsearch是基於文檔存儲數據的,之前一個對象以一條記錄存儲在數據庫裏面,如今是以JSON的方式進行文檔存儲,使得存儲操做變得更加方便簡單。在Elasticsearch中,文檔屬於一種類型(type),而這些類型存在全部(index)中,關係能夠用下面的方式類比:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
複製代碼

索引的含義和區分

索引在Elasticsearch有不一樣的含義,因此須要區分它

  • 索引(名詞)如上文所述,一個索引(index)就像是傳統關係型數據庫中的數據庫,它是相關文檔的存儲的地方,index的附屬是indices或indexes.

  • 索引(動詞)[索引一個文檔]標識一個文檔存儲到索引(名詞)裏,以便它能夠被檢索或者查詢。這很像SQL中的INSERT關鍵字,差異是,若是翁當已經存在,新的文檔將覆蓋就的文檔

  • 倒排索引:傳統數據庫爲特定列增長一個索引,例如B-Tree索引來加速索引。Elasticsearch和Lucene使用一種叫作倒排索引的(inverted index)的數據結構來表達到相同的目的。

全文檢索

傳統的數據庫很難實現該功能,可是在Elasticsearch卻能夠輕易的實現全文的檢索。

例如:

GET /_search
{
  "query": {
    "match": {
      "about": "rock climbing"
    }
  }
}
複製代碼

返回以下結果:

這個例子返回了兩個結果,可是這兩個結果的分數是分高低的,第一個的分數顯然高於第二個的。這個例子也解釋了Elasticsearch在文本字段中進行了全文的檢索,而且返回相關性嘴袋的結果集。相關性在Elasticsearch在很是重要,這個概念也是體現了傳統數據庫和Elasticsearch的區別。

短語搜索

除了上面的全文檢索,咱們有時候也須要精確的匹配若干的單詞或者短語,這個時候Es也是能夠作到的。

GET /_search
{
  "query": {
    "match_phrase": {
      "about": "rock climbing"
    }
  }
}
複製代碼

返回結果以下:

高亮搜索

高亮匹配到關鍵字,這樣用戶能夠知道Wie上面這些文檔和查詢相匹配。在Elasticsearch作到這個是很簡單的,只須要在語句中添加highlight參數。

GET /_search
{
  "query": {
    "match_phrase": {
      "about": "rock climbing"
    }
  },
  "highlight": {
    "fields": {
      "about":{}
    }
  }
}
複製代碼

返回的結果以下:

數據分析

Elasticsearch有一個功能叫作聚合(aggresgation),容許在生產複雜的分析統計,它的功能項傳統數據庫的GROUP BY,可是比傳統的數據庫的GROUP BY要強大不少。

GET megacorp/employee/_search
{
  "aggs": {
    "all_interests": {
      "terms": {
      #這裏須要注意的是若是根據某個字段統計須要在後面添加keyword關鍵字
        "field": "interests.keyword"
      }
    }
  }
}
複製代碼
相關文章
相關標籤/搜索