1. 程式人生 > >ElasticSearch學習(2)安裝和初步使用

ElasticSearch學習(2)安裝和初步使用

參考文件

1 安裝

1.1 確認Java版本

  1. 最新版ES 6.0.1至少需要Java 8
  2. 手冊上推薦Oracle JDK version 1.8.0_131
java -version
echo $JAVA_HOME

1.2 Linux下安裝

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.tar.gz
tar -xvf elasticsearch-6.0.1.tar.gz
cd elasticsearch-6.0.1/bin
./elasticsearch

1.3 Windows下安裝

1.4 啟動叢集

# linux下
cd %PROGRAMFILES%\Elastic\Elasticsearch\bin
# powershell下
cd $env:PROGRAMFILES\Elastic\Elasticsearch\bin
.\elasticsearch.exe
# 啟動時指定叢集名字和節點名字
./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name

2 探索叢集

2.1 REST API

使用REST API可以乾的事:

  1. cluster,node,index健康、狀態、策略查詢
  2. cluster,node,index資料和元資料管理
  3. CRUD、indexes查詢操作
  4. 執行預操作,例如paging,sorting,filtering,scripting,aggregations等

2.2 安裝kibana

參考文件

  1. 下載和解壓kibana
  2. 配置config/kibana.yml檔案,設定elasticsearch.url為es例項
  3. 執行kibana
# linux
bin/kibana
# windows
bin\kibana.bat

2.3 叢集健康狀態

2.3.1 查詢叢集健康狀態

GET /_cat/health?v

使用postman執行查詢
在這裡插入圖片描述
返回json結果

GET 127.0.0.1:9200/_cat/health?format=json&pretty
# response
[
    {
        "epoch": "1541249930",
        "timestamp": "20:58:50",
        "cluster": "elasticsearch",
        "status": "green",
        "node.total": "1",
        "node.data": "1",
        "shards": "0",
        "pri": "0",
        "relo": "0",
        "init": "0",
        "unassign": "0",
        "pending_tasks": "0",
        "max_task_wait_time": "-",
        "active_shards_percent": "100.0%"
    }
]

三種健康狀態:

  1. green:所有服務執行正常,叢集全部功能都可用
  2. yellow:所有資料都可用,但部分replica失效,叢集全部功能都可用
  3. red:部分資料不可用,叢集部分功能可用

2.3.2獲取叢集節點列表

GET /_cat/nodes?v
GET 127.0.0.1:9200/_cat/nodes?format=json&pretty
# response
[
    {
        "ip": "127.0.0.1",
        "heap.percent": "11",
        "ram.percent": "41",
        "cpu": "8",
        "load_1m": null,
        "load_5m": null,
        "load_15m": null,
        "node.role": "mdi",
        "master": "*",
        "name": "my_first_node"
    }
]

2.4 列出所有indices

GET /_cat/indices?v

2.5 建立index

建立一個名為customer的index,並列出所有分片

PUT /customer?pretty
GET /_cat/indices?v
PUT 127.0.0.1:9200/customer?pretty
# response
{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "customer"
}
GET 127.0.0.1:9200/indices?format=json&pretty
# response
[
    {
        "health": "yellow",	# 目前只有一個節點,無法分派1個replica,固為yellow狀態
        "status": "open",
        "index": "customer",
        "uuid": "BpesQm0kRhWBauTfht4UZg",
        "pri": "5",					# 5個primary shards
        "rep": "1",					# 1個replica
        "docs.count": "0",	# 0個document
        "docs.deleted": "0",
        "store.size": "1.1kb",
        "pri.store.size": "1.1kb"
    }
]

2.5 index和query document

2.5.1 index

index一個ID為1的customer document 到customer index

PUT /customer/_doc/1?pretty
{
  "name": "John Doe"
}
# response
{
    "_index": "customer",
    "_type": "doc",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

2.5.2 query

GET /customer/_doc/1?pretty
# response
{
    "_index": "customer",
    "_type": "doc",
    "_id": "1",
    "_version": 1,
    "found": true,
    "_source": {								# 返回全量JSON document
        "name": "Xiaotong Who"
    }
}

2.6 刪除 index

DELETE /customer?pretty
# response
{
    "acknowledged": true
}
GET /_cat/indices?v
# response
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size

2.7 訪問ES資料的模式

<HTTP Verb> /<Index>/<Type>/<ID>

3 修改資料

3.1 修改資料:替換 document

對某一document執行PUT操作,ES會自動替換document中的值

# 建立index和document
PUT /customer
PUT /customer/_doc/1?pretty
{
  "name": "John Doe"
}
GET  /customer/_doc/1?pretty
# 替換之前的document
PUT /customer/_doc/1?pretty
{
	"name":"Tom Hu"
}
GET  /customer/_doc/1?pretty
# 建立一個新的document
PUT /customer/_doc/2?pretty
{
	"name":"Yaping Leaf"
}

建立document的時候,ID是可選的,如果沒指定,ES會自動生成一個隨機ID

3.2 修改資料:更新資料

  1. 除了插入和替換資料,還可以更新資料
  2. 更新資料不是真的跟新,而是把舊的刪除,然後建立個新的document
# 修改名字,並增加年齡
POST /customer/_doc/1/_update?pretty
{
	"doc":{"name":"Xiaotong Who","age":20}
}
  1. update支援使用簡單的指令碼
    ctx._source表示當前document的引用
# 給年齡增加5
POST /customer/_doc/1_update?pretty
{
	"script":"ctx._source.age += 5"
}

3.3 刪除documents

DELETE /customer/_doc/2?pretty

3.4 批量處理

# 執行兩條index document
POST /customer/_doc/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "Tom Hu" }
{"index":{"_id":"2"}}
{"name": "Yaping Leaf" }
# 執行跟新和刪除
POST /customer/_doc/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "Tom Hu becomes Xiaotong Who" } }
{"delete":{"_id":"2"}}

4 探索資料

4.1 search API

4.1.1 傳送請求

通過URL傳送請求

GET /bank/_search?q=*&sort=account_number:asc&pretty
  1. 使用_search節點
  2. q=*引數可以匹配index中的所有document
  3. sort=account_number:asc引數使返回值以account_number欄位按升序排序
  4. pretty引數使ES將返回值以JSON的形式返回,便於閱讀
# response(部分)
{
  "took" : 63,				# 查詢花費了63毫秒
  "timed_out" : false,		# 查詢沒有超時
  "_shards" : {				# 總共5個shards被查詢,成功5個,跳過0個,失敗0個
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {				# 查詢結果 
    "total" : 1000,			# 滿足查詢標準的document總量
    "max_score" : null,		
    "hits" : [ {			# 實際查到的document列表,預設前10條資料
      "_index" : "bank",		
      "_type" : "_doc",
      "_id" : "0",
      "sort": [0],			# 排序key
      "_score" : null,	
      "_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"[email protected]","city":"Hobucken","state":"CO"}
    }, {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "1",
      "sort": [1],
      "_score" : null,
      "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"[email protected]","city":"Brogan","state":"IL"}
    }, ...
    ]
  }
}

通過method body傳送請求

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

4.2 query語言

例1 :查詢

GET /bank/_search
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 10
}
  1. query:定義查詢
  2. match_all:查詢全部文件
  3. from:從第10條開始
  4. size:返回數量

例2:按balance欄位降序排序

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": { "balance": { "order": "desc" } }
}

4.3 執行search

4.3.1 查詢document中的部分欄位

GET /bank/_search
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"] 	# 只返回account_number和balance欄位
}

4.3.2 條件查詢

返回account_number為20的document

GET /bank/_search
{
  "query": { "match": { "account_number": 20 } }
}

返回在address欄位中含有“mill“或者”lane”

GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}

返回在address欄位中含有“mill lane”

GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

4.3.3 Bool查詢

4.3.3.1 must子句:所有match查詢都必須為都真才會匹配成功

查詢address欄位同時包含mill和lane的document

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}
4.3.3.2 shoud子句:只要有一個match查詢為真就會匹配成功

查詢address欄位包含“mill”或“lane”的document

GET /bank/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}
4.3.3.3 must_not子句:所有match查詢都為假,才會匹配成功

查詢address欄位既不包含“mill”也不包含“lane”的document

GET /bank/_search
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}
4.3.3.4 組合bool查詢

查詢age為40,state不為ID的賬戶:

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}

4.4 執行filter

4.4.1 document score (_score欄位)

  1. 用來表示document與我們指定的查詢的相關程度,數值越大,相關度越高,數值越小,相關度越低。
  2. 查詢不總是會有score來衡量相關性,一般在執行filter的時候才會涉及
    3.bool查詢也支援filter子句,在bool查詢中寫filter子句,可以讓我們在不用計算score增減的情況下,使用別的子句來條件查詢document

4.4.2 range查詢

可以通過限定一個範圍值來過濾文件,通常用在數值或者日期的過濾。
舉例:返回餘額在20000到30000的賬戶

GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },	# 匹配所有document
      "filter": {					# filter子句
        "range": {					# range子句
          "balance": {				# 餘額
            "gte": 20000,			# 大於等於20000 
            "lte": 30000			# 小於等於30000 
          }
        }
      }
    }
  }
}

4.5 執行aggregation

  1. 提供類似SQL GROUP BY語句以及SQL Aggregation功能
  2. 能同時返回search結果集以及aggregation結果

4.5.1 Group By

將賬戶按state排序,然後按count降序排序,返回Top10的state
如果寫SQL

SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC LIMIT 10;
GET /bank/_search
{
  "size": 0,	# 在response中不返回查詢到的document,只需要數量
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

# response
{
  "took": 29,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
    "total" : 1000,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound": 20,
      "sum_other_doc_count": 770,
      "buckets" : [ {
        "key" : "ID",
        "doc_count" : 27
      }, {
        "key" : "TX",
        "doc_count" : 27
      }, {
        "key" : "AL",
        "doc_count" : 25
      }, {
        "key" : "MD",
        "doc_count" : 25
      }, {
        "key" : "TN",
        "doc_count" : 23
      }, {
        "key" : "MA",
        "doc_count" : 21
      }, {
        "key" : "NC",
        "doc_count" : 21
      }, {
        "key" : "ND",
        "doc_count" : 21
      }, {
        "key" : "ME",
        "doc_count" : 20
      }, {
        "key" : "MO",
        "doc_count" : 20
      } ]
    }
  }
}

4.5.2 aggregation語句中巢狀aggregation

通常用於對聚合得到的資料做另外的總結操作
對賬戶數在前十的州求餘額平均值

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

按賬戶數前十的州餘額平均值降序排序

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

按年齡段分別聚合,然後在各年齡段內按性別聚合,然後獲取到各年齡段中各性格的平均賬戶餘額

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_age": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 30,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_gender": {
          "terms": {
            "field": "gender.keyword"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}

相關推薦

ElasticSearch學習2安裝初步使用

參考文件 1 安裝 1.1 確認Java版本 最新版ES 6.0.1至少需要Java 8 手冊上推薦Oracle JDK version 1.8.0_131 java -version echo $JAVA_HOME 1.2 Linux下安裝 curl -

oracle 11g ocp 筆記2-- 安裝創建數據庫

apu 數據庫管理工具 OS 靜默 software app %s 變量 多個 1.了解 數據庫管理工具 1.2 OUI(Oracle Universal Installer) ·OUI產品清單(inventory)位置 Windows:

Oracle資料庫學習安裝簡單使用

新公司的新專案,需要用到Oracle資料庫,所以現在便來解除此資料庫,不得不說,這個資料庫還這是麻煩。 安裝倒是簡單,就是中間會遇到各種問題。 安裝步驟參考:https://blog.csdn.net/fancheng614/article/details/78172894 安裝完成後,中間不要有太大的

Junit入門學習1------- 安裝簡單使用

一、簡介 JUnit是一個開源的java單元測試框架。在1997年,由 Erich Gamma 和 Kent Beck 開發完成。這兩個牛人中Erich Gamma 是 GOF 之一;Kent Beck 則在 XP 中有重要的貢獻(你覺得眼熟一點都不奇怪)。        

linux學習2安裝必要的軟體

一、既然有網路了,那就趕緊告別vi,換成高大上的vim吧,我是用yum命令安裝的1#yum -y update 更新yum源(我是強迫症,就想更新一下,不更新也一樣,大家也可以研究一下更換yum源)2#yum install vim -y然後就等著完成吧。二、每次點虛擬機器滑

webpack學習安裝命令列、一次js/css的打包體驗及不同版本錯誤

一、前言   找了一個視訊教程開始學習webpack,跟著視訊學習,在自己的實際操作中發現,出現了很多問題。基本上都是因為版本的原因而導致,自己看的視訊是基於webpack 1.x版,而自己現在早已是webpack 4.X了。覺得學習還是要以最新的來,也許以後並不會再接觸到1.x的。不過了解不同版本更迭的問

Elasticsearch學習在windows上安裝啟動Elasticseach

步驟 1、安裝JDK,至少1.8.0_73以上版本,java -version 2、下載和解壓縮Elasticsearch安裝包,目錄結構 3、啟動Elasticsearch:bin\elasticsearch.bat,es本身特點之一就是開箱即用,如果是中小型應用,資料量少,操作不

Linux學習之路-Nginx2安裝及配置文件篇【23】---20180210

Nginx編譯 Nginx yum安裝 主配置文件分析 Core functionality分 一、Nginx的安裝方法及配置介紹1、yum安裝官方: http://nginx.org/packages/centos/7/x86_64/RPMSFedora-EPEL: http

Redis學習2-redis安裝

註意 編譯依賴 redis啟動 依賴 環境 code 技術分享 c-c++ spa 安裝redis需要先從官網下載的源碼進行編譯,編譯依賴GCC環境,如果沒有GCC環境,需要安裝GCC。 yum install gcc-c++ 步驟1:上傳 將Win

robotframework 學習2 :使用RIDE進行介面測試之傳送請求接收資料斷言

一、RIDE的介紹:         RIDE是robotframework圖形操作前端,也可以理解為一種編輯器,它以cell的形式來進行定義資料和方法,返回結果等,我們可以使用它進行建立測試用例和編寫測試指令碼,並且執行自動化測試。  

從零開始學習HTML+CSS2安裝Emmet

如何在Sublime Text3中安裝Emmet外掛 方法:參考官網 https://packagecontrol.io/installation 可能遇到的問題及處理辦法 問題:在安裝時彈出這樣顯示的視窗 Error while loading PyV8 binary: e

Java大資料結合學習2

抽象類 1.abstract宣告; 為什麼介面的物件可以指向例項化物件呢? 介面 1.介面不能例項化,但是介面的物件可以指向實現類的物件。 2.介面內的方法預設為public abstract,所以不能被例項化, 3.介面其實就是為了實現多繼承

git學習廖雪峰git網站2---安裝git及版本庫

因為工作需要,所以簡單學習了一下git。工作系統是Windows系統,所以就說一下Windows的學習和安裝。 安裝git 1、在Windows上安裝git 直接從git官網下載安裝程式,然後按預設選項安裝即可。 安裝完成後,在開始選單裡找到“Git”->“Git

ucosiii學習2——空閒任務節拍任務

1.空閒任務Idle Task  OS_IdleTaskInit(p_err);      os_core.c中 系統在初始化過程中,會先建立一個空閒任務,在建立空閒任務時先初始化任務控制塊和連結串列,然後進行優先順序和就緒連結串列插入操作(OS_PrioInsert和O

FrameWork2結構程式碼學習

整體結構: Android7.0的根目錄結構說明如下表所示: |– Makefile (全域性Makefile檔案,用來定義編譯規則) |– abi (應用程式二進位制介面) |– art (ART執行環境) |– bionic (bionic C庫) |– bootab

轉載深度學習2——線性單元梯度下降

原文地址:https://www.zybuluo.com/hanbingtao/note/448086 轉載在此的目的是自己做個筆記,日後好複習,如侵權請聯絡我!!   在上一篇文章中,我們已經學會了編寫一個簡單的感知器,並用它來實現一個線性分類器。你應該還記得用來訓練感知器的『感知器規則』。然而,我們並沒有

Docker學習2:Docker映象介紹容器的兩種建立方式

1.什麼是Docker映象     Docker映象是啟動容器構建的基石,是由檔案系統疊加而成,最底端是一個引導檔案系統,即bootfs,這很像典型的Linux的引導檔案系統,但是Docker使用者幾

機器學習十二——機器學習中的矩陣方法2特徵值奇異值

QR分解(續) 令A=[a1,⋯,an],其中ai為列向量。則: u1u2u3uk=a1,=a2−proju1a2,=a3−proju1a3−proju2a3,⋮=ak−∑j=1k−1projujak,e1e2e3ek=u1∥u1∥=u2∥u2∥=u3∥

Elasticsearch學習1安裝部署單機多節點模式

Elasticsearch叢集環境部署(單機多節點) 1. 環境準備 ps: 由於elasticsearch 2.x版本不支援bigdesk外掛,本文采用1.7.3版本 1.1 安裝jdk 下載好的jdk-8u77-linux-x64.tar.

javaWeb學習2——web.xmlpom.xml都是幹嘛用的

web.xml和pom.xml看起來差不多都是仨字母,檔案字尾都一樣 對於初學者來講,剛接觸這裡面的東西,感覺亂七八糟的傻傻弄不清楚 我也以一個初學者的角度,說說自己的理解 一、POM啥意思呢,百度了一下叫專案物件模型------->該檔案用於管理:原始碼、配置檔案、