本文根據ElasticSearch官方文檔整理所得,簡單介紹ElasticSearch的概念以及一些簡單的檢索方法數據庫
首先下載ElasticSearch和Kibana到本地,注意這兩個東西的版本號要一致,而後啓動Kibana,打開http://localhost:5601/app/kibana便可進入GUI的管理界面,進入Dev Tools便可操做ES。json
先看ES中,索引的兩個概念:app
存儲數據到 Elasticsearch 的行爲叫作 索引(動詞) ,但在索引一個文檔以前,須要肯定將文檔存儲在哪裏。負載均衡
一個 Elasticsearch 集羣能夠包含多個索引 (名詞),相應的每一個索引能夠包含多個類型。這些不一樣的類型存儲着多個文檔* 每一個文檔又有多個屬性 。分佈式
能夠看到上述語句不是很通順,主要是因爲這裏的索引有兩個意思:spa
例子: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
檢索文檔就像HTTP請求同樣,執行一個GET請求便可取回JSON文檔:排序
GET /megacorp/employee/1
索引
相似的GET還能夠改成HEAD、DELETE等。
搜索全部僱員:
GET /megacorp/employee/_search
查詢JSON中的任意指定字段:
GET /megacorp/employee/_search?q=last_name:Smith
使用查詢表達式搜索,它支持構建更加複雜和健壯的查詢,使用請求體。:
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
複製代碼
GET /megacorp/employee/_search
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 }
}
}
}
}
}
複製代碼
全文搜索能夠完成傳統關係型數據庫很難作到的事情,如搜索全部喜歡攀巖的僱員:
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的高,排在後面。而傳統的關係型數據庫則是要麼匹配要麼徹底不匹配。
那若是我想像關係型數據庫同樣只匹配徹底符合的怎麼辦呢?就是用短語匹配的查詢:match_phrase
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
複製代碼
則只會返回徹底匹配的John的文檔。
在使用聚合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" }
}
}
}
}
}
複製代碼
Elasticsearch 儘量地屏蔽了分佈式系統的複雜性。這裏列舉了一些在後臺自動執行的操做: