ElasticSearch學習一-小試牛刀

本文根據ElasticSearch官方文檔整理所得,簡單介紹ElasticSearch的概念以及一些簡單的檢索方法數據庫

首先下載ElasticSearch和Kibana到本地,注意這兩個東西的版本號要一致,而後啓動Kibana,打開http://localhost:5601/app/kibana便可進入GUI的管理界面,進入Dev Tools便可操做ES。json

1. 索引

先看ES中,索引的兩個概念:app

存儲數據到 Elasticsearch 的行爲叫作 索引(動詞) ,但在索引一個文檔以前,須要肯定將文檔存儲在哪裏。負載均衡

一個 Elasticsearch 集羣能夠包含多個索引 (名詞),相應的每一個索引能夠包含多個類型。這些不一樣的類型存儲着多個文檔* 每一個文檔又有多個屬性 。分佈式

能夠看到上述語句不是很通順,主要是因爲這裏的索引有兩個意思:spa

  1. 名詞,這裏的索引就像一個數據庫同樣。
  2. 動詞,索引(動詞)一個文檔就是存儲一個文檔到一個索引(名詞)中以便它能夠被檢索和查詢到。就像SQL中的Insert同樣。

例子:rest

PUT /megacorp/employee/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}
複製代碼

路徑/megacorp/employee/1包含了三部分的信息:megacorp就是索引名稱(像數據庫),employee(像一張表),1(特定employee,就像標識每一行的主鍵)。接下來的JSON就是儲存的內容了。code

2.檢索文檔

檢索文檔就像HTTP請求同樣,執行一個GET請求便可取回JSON文檔:排序

GET /megacorp/employee/1索引

相似的GET還能夠改成HEAD、DELETE等。

2.1輕量搜索

搜索全部僱員:

GET /megacorp/employee/_search

查詢JSON中的任意指定字段:

GET /megacorp/employee/_search?q=last_name:Smith

使用查詢表達式搜索,它支持構建更加複雜和健壯的查詢,使用請求體。:

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}
複製代碼

2.2複雜的查詢:

GET /megacorp/employee/_search
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "last_name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}
複製代碼

2.3 全文搜索

全文搜索能夠完成傳統關係型數據庫很難作到的事情,如搜索全部喜歡攀巖的僱員:

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

這彷佛與以前沒什麼不一樣啊?可是請看返回結果:

"hits": [
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "1",
        "_score": 0.53484553,
        "_source": {
          "first_name": "John",
          "last_name": "Smith",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      },
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "2",
        "_score": 0.26742277,
        "_source": {
          "first_name": "Jane",
          "last_name": "Smith",
          "age": 32,
          "about": "I like to collect rock albums",
          "interests": [
            "music"
          ]
        }
      }
    ]
複製代碼

Elasticsearch 默認按照相關性得分排序,即每一個文檔跟查詢的匹配程度。第一個最高得分的結果很明顯:John Smith 的 about 屬性清楚地寫着 「rock climbing」 。可是Jane也返回了,可是因爲他的關鍵字裏並無徹底匹配,因此他的相關性沒有John的高,排在後面。而傳統的關係型數據庫則是要麼匹配要麼徹底不匹配。

2.3 短語匹配

那若是我想像關係型數據庫同樣只匹配徹底符合的怎麼辦呢?就是用短語匹配的查詢:match_phrase

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

則只會返回徹底匹配的John的文檔。

2.4 分析查詢

在使用聚合agg以前須要先對查詢的字段加上fileddata=true,由於文檔中寫道

Fielddata can consume a lot of heap space, especially when loading high cardinality text fields.

fileddata會消耗大量的堆空間,因此默認是關閉的,在這裏要手動打開。

PUT megacorp/_mapping/employee/
{
  "properties": {
    "interests": { 
      "type":     "text",
      "fielddata": true
    }
  }
}
複製代碼

有點像Group By:如找出Employee中最受歡迎的興趣愛好:

GET /megacorp/employee/_search
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
},
複製代碼

在輸出中能夠看到,每一個interest按照人數排序:

{
   ...
   "hits": { ... },
   "aggregations": {
      "all_interests": {
         "buckets": [
            {
               "key":       "music",
               "doc_count": 2
            },
            {
               "key":       "forestry",
               "doc_count": 1
            },
            {
               "key":       "sports",
               "doc_count": 1
            }
         ]
      }
   }
}
複製代碼

這個aggs字段還能夠做爲query字段的子查詢。如:

GET /megacorp/employee/_search
{
  "query": {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}
複製代碼

還支持分級彙總,如查詢每一個興趣的員工平均年齡:

GET /megacorp/employee/_search
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}
複製代碼

3. 分佈式特性

Elasticsearch 儘量地屏蔽了分佈式系統的複雜性。這裏列舉了一些在後臺自動執行的操做:

  • 分配文檔到不一樣的容器 或分片中,文檔能夠儲存在一個或多個節點中
  • 按集羣節點來均衡分配這些分片,從而對索引和搜索過程進行負載均衡
  • 複製每一個分片以支持數據冗餘,從而防止硬件故障致使的數據丟失
  • 將集羣中任一節點的請求路由到存有相關數據的節點
  • 集羣擴容時無縫整合新節點,從新分配分片以便從離羣節點恢復
相關文章
相關標籤/搜索