1. 程式人生 > >ElasticSearch初探之所有初次使用記錄(一)

ElasticSearch初探之所有初次使用記錄(一)

2018-4–28

1.第一次使用kibana時,需要指定一個ES索引,該索引會被置為預設索引(索引多了後可以修改預設值),框裡的預設值是logstash-,因為kibana預設我們是通過logstash匯入elasticsearch的資料。如果有時間序列欄位,可以在Time Filter field name 下填入

2.kibana左上角的discover中,我們可以使用Lucene查詢語法,提交搜尋請求以及過濾結果。

3.你可以使用如下語法查詢所有資料:

GET _search
{
"query": { "match_all": {} }
}


會返回所有的index的資訊,以及“命中”的文件資訊

4.檢視叢集狀態:

GET /_cat/health?v&pretty’ 或者 GET _cluster/health

前者返回體如下:

epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1524923123 21:45:23 elasticsearch-win yellow 1 1 2 2 0 0 2 0 - 50.0%

  • status。Green 表示一切正常(叢集功能齊全), yellow 表示所有資料可用,但是有些副本尚未分配(叢集功能齊全),red 意味著由於某些原因有些資料不可用。注意,叢集是 red,它仍然具有部分功能(例如,它將繼續從可用的分片中服務搜尋請求),但是您可能需要儘快去修復它,因為您已經丟失資料了。
  • 1個節點,一個data目錄,2分片(shards),2主分片(pri),百分之50的分片處於“活躍”狀態(剩餘的暫時不知)
  • 狀態為黃色因是因為Elasticsearch預設為這個索引建立了一個副本。由於此刻我們只有一個節點正在執行,因此只有在其他節點加入群集的時間點之後才能分配一個副本(以獲得高可用性)。一旦該副本被分配到第二個節點上,該索引的健康狀態將變為綠色。

後者返回的結果顯示更佳,當然也可以在head中查詢:
這裡寫圖片描述

5.GET /_cat/nodes 檢視叢集節點資訊

6.GET /_cluster/state 檢視叢集狀態【預設情況下,群集狀態請求將路由到主節點,以確保返回最新的群集狀態。】

叢集狀態的查詢還可以進一步細分,具體的參考官網doc

7.GET /_cat/indices?v 列出所有的索引【v引數顯示各個欄位名,pretty漂亮地列印JSON響應(如果有的話)】

8.GET /18-3-9test/myfirsttype/1?pretty 指定index/文件/id進行查詢
【這裡用到的索引是我之前建立的,建立索引可參考 24

9.插入一條資料

PUT /18-3-9test/myfirsttype/2?pretty
{
"name": "zhangsan",
"desc": "a cool boy"
}

返回結果:

{
“_index”: “18-3-9test”,
“_type”: “myfirsttype”,
“_id”: “2”,
“_version”: 1,
“result”: “created”,
“_shards”: {
“total”: 2,
“successful”: 1,
“failed”: 0
},
“created”: true
}

10.修改文件【除了語法,與update的區別還在於,修改文件不會先刪除文件】
返回體的區別:

“_version”: 3,
“result”: “updated”,
“created”: false

PUT /18-3-9test/myfirsttype/3/?pretty
{
“name”: “zhangsan_2”,
“desc”: “not a cool boy”,
“script” : “ctx._source.age += 15”,
“school”: “shehuidaxue”
}

11.更新文件:【注意儘管 Elasticsearch 沒有在後臺馬上更新。每當我們做一次更新,Elasticsearch 刪除舊的文件,然後一次性應用更新索引一個新文件。】
與替換文件的區別在於,POST,_update

POST /18-3-9test/myfirsttype/3/_update?pretty
{
“name”: “zhangsan”,
“desc”: “a cool boy”,
“script” : “ctx._source.age -= 5”,
“school”: “shanxidaxue”
}
新增一“school”欄位,使用簡本來將 age 減 5

12.插入一條資料,不指定ID時,使用post命令,自動生成一個id

“_id”: “AWMMvOBkXN6wZSVZnIbK”,

13.批處理:【同時插入多條資料或者插入、刪除等共用】
不指定ID,關鍵詞:_bulk
同時插入多條資料:【多欄位不要回車

POST /18-3-9test/myfirsttype/_bulk
{"index":{"_id":"6"}}
{"name": "wangwu","desc": "no desc","age" : "15","school": "beijingdaxue"}
{"index":{"_id":"7"}}
{"name": "wangwu_2","desc": "no desc_2","age" : "16","school": "beijingdaxue_"}

插入、刪除等共用:

POST _bulk
{ "update" : { "_index" : "lagou" , "_type" : "job1" , "_id" : "1" } } 
{"doc":{"title":"python分散式爬蟲開發","salary_min":15000,"city":"北京","company":{"name":"百度","company_addr":"北京市軟體園"},"publish_date":"2099-99-99","comments":15}}
{ "delete" : { "_index" : "lagou" , "_type" : "job2" , "_id" : "2" } }

這裡寫圖片描述
這裡寫圖片描述

14.和elasticsearch互動,及restful引數
和elasticsearch互動

  • 使用java客戶端【分為兩種,節點客戶端(Node client)傳輸客戶端(Transport client)
  • 使用 RESTful API 通過埠 9200 和 Elasticsearch 進行通訊

15.面向文件:Elasticsearch 是 面向文件 的,意味著它儲存整個物件或 文件。Elasticsearch 不僅儲存文件,而且 _索引 每個文件的內容使之可以被檢索。在 Elasticsearch 中,你 對文件進行索引、檢索、排序和過濾–而不是對行列資料。這是一種完全不同的思考資料的方式,也是 Elasticsearch 能支援複雜全文檢索的原因。

16.一些適用場景的業務需求:

支援包含多值標籤、數值、以及全文字的資料
檢索任一僱員的完整資訊
允許結構化搜尋,比如查詢 30 歲以上的員工
允許簡單的全文搜尋以及較複雜的短語搜尋
支援在匹配文件內容中高亮顯示搜尋片段
支援基於資料建立和管理分析儀表盤

17.儲存資料到 Elasticsearch 的行為叫做 索引 ,但在索引一個文件之前,需要確定將文件儲存在哪裡。

一個 Elasticsearch 叢集可以 包含多個 索引 ,相應的每個索引可以包含多個 型別 。 這些不同的型別儲存著多個 文件 ,每個文件又有 多個 屬性

18.索引的幾種概念:

你也許已經注意到 索引 這個詞在 Elasticsearch 語境中包含多重意思, 所以有必要做一點兒說明:
索引(名詞)
如前所述,一個 索引 類似於傳統關係資料庫中的一個 資料庫 ,是一個儲存關係型文件的地方。 索引 (index) 的複數詞為 indices 或 indexes 。
索引(動詞)
索引一個文件 就是儲存一個文件到一個 索引 (名詞)中以便它可以被檢索和查詢到。這非常類似於 SQL 語句中的 INSERT 關鍵詞,除了文件已存在時新文件會替換就文件情況之外。Elasticsearch將查詢傳送到不同的shards,並將返回結果合併。
倒排索引
關係型資料庫通過增加一個 索引 比如一個 B樹(B-tree)索引 到指定的列上,以便提升資料檢索速度。Elasticsearch 和 Lucene 使用了一個叫做 倒排索引 的結構來達到相同的目的。
預設的,一個文件中的每一個屬性都是 被索引 的(有一個倒排索引)和可搜尋的。一個沒有倒排索引的屬性是不能被搜尋到的
Gateway:儲存完整的索引資料(快照),可以是本地檔案系統,也可以是HDFS、S3等問檔案系統。

19.簡單搜尋:

  • 指定索引、type:
    GET /lagou/job1/_search
  • 指定欄位值
    GET /18-3-9test/_search?q=age:>10
  • 。。。

2018-4-30
20.DSL版本的查詢
使用領域特定語言 (DSL), 指定一個 JSON 請求

  • GET /18-3-9test/myfirsttype/_search
    {
    "query":{
    "match": {
    "desc": "*no*"
    }
    }
    }

    返回18-3-9test/myfirsttype/下“desc”欄位中帶有“no”的文件
"hits": {
    "total": 5,
    "max_score": 0.6445456,
    "hits": [
  • 進一步過濾以上檢索到的結果:【desc欄位包含no,年齡小於16】
GET /18-3-9test/myfirsttype/_search
{
  "query":{
    "bool":{
      "must":{
        "match": {
          "desc": "*no*"}
          },
      "filter":{
        "range":{
          "age":{"lt":16}
          }
        }
      }
    }
}

返回體:

"hits": {
    "total": 3,
    "max_score": 0.6445456,
    "hits": [
      {
        "_index": "18-3-9test",
        "_type": "myfirsttype",
        "_id": "6",
        "_score": 0.6445456,

可以看出max_score以及其他結果的score都是0.6445456。Elasticsearch 預設按照相關性得分排序,即每個文件跟查詢的匹配程度,我的文件中,查詢結果的的desc都是“no desc”;年齡都是15,所以結果相同【這種情況下貌似是按修改時間逆序排序,最近修改的靠後——個人結論,待驗證

PS: 初學者小小的抱怨下——這麼簡單的一個檢索,一堆大括號,一堆雙引號,就算寫得不累,看得也累啊,簡直無法與SQL相提並論。。。“過於結構化的檢索非結構文件???”
哪天寫個很多條件的篩選,排錯時數{}(大括號)還不得數花眼???

  • 使用match_phrase_prefix匹配指定短語開頭的短語:【類似的還有“match_phrase”】
GET /18-3-9test/myfirsttype/_search
{
  "query":{
        "match_phrase_prefix": 
        {
          "school": "beijin"
        }
    }
}

21.GET /18-3-9test/_mapping 使用Mapping瞭解索引檔案的相關資訊

部分結果:
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"school": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},

22.關於Mapping:
elasticsearch中的mapping類似於資料庫中的Schema。

  • mapping定義索引下Type欄位的處理規則,索引如何建立,索引的資料型別,是否儲存原始索引JSON文件,是否壓縮原始JSON文件,是否需要分詞處理等
  • 一個索引檔案下可以儲存不同Mapping的型別檔案
  • Mapping可以通過語句刪除,對應mapping下的資料也會被刪除
  • elasticsearch有一定的欄位自動推理能力,但是當需要對某些欄位新增特殊屬性時(比如該欄位是否分詞,高亮,是否儲存,使用什麼分詞器等等),就需要手動的配置mapping了。

23.GET /18-3-9test/_search?q=age:>10 查詢年齡大於10的文件
q後的“=”是基於Lucene的查詢語句,“=”後接查詢欄位,用”:”分割查詢條件(也可以使用Query DSL語法進行查詢)

"hits": {
"total": 8,
"max_score": 1,
"hits": [

‘’命中‘’8
多個文件,以陣列的形式返回

24.建立索引並進行一些設定
【使用curl進行建立】
【linux下自然方便,如果使用windows,可以安裝curl,或者直接使用cmder(推薦)】

curl -XPUT 'http://172.22.112.1:9200/18-4-30test/' -d '{
"settings":{
"index":{
"number_of_shards":5,
"number_of_replicas":1
        }
    }
}'

這裡寫圖片描述
補充:其他配置

  • blocks.read_only: 設定ture後,只允許讀,不允許寫或者更新
  • blocks.read: 設定ture後,禁止讀
  • blocks.write: 設定ture後,禁止寫
  • blocks.metadata: 設定ture後,禁止對metadata操作

25.建立索引並進行一些設定
【這裡在kibana中進行建立】

PUT /18-4-30test/
{
"settings":{
"index":{
"number_of_shards":5,
"number_of_replicas":1
        }
    }
}

返回體:

“type”: “index_already_exists_exception”,
“reason”: “index [18-4-30test/8LkZWK7zTa–VrGNY8ffdQ] already exists”,

26.GET /18-4-30test/_settings
獲取索引檔案的配置資訊
或者curl:
這裡寫圖片描述
- 補充,索引可以有多個,比如
GET /18-4-30test,18-3-9test/_settings
- 也可以使用萬用字元
GET /*test/_settings
- 還可以使用_all引數
GET /_all/_settings

27.修改索引配置

PUT /18-4-30test/_settings
{
  "index":{
    "number_of_replicas":2
        }
}

返回:

{
  "acknowledged": true
}

28.刪除一個索引:
DELETE /customer
注意:沒有任何提示【至少kibana中沒有】

29.

~短語字典:
1.match_phrase 查詢時匹配指定‘’短句‘’【完全匹配,比如match_phrase 指定123,可以檢索出123,但是不能檢索出1234、0123】
2.match_phrase_prefix 查詢‘’指定短句開頭‘’的文件【可檢索出123,1234;不能檢索0123】
3.query 後面是所有查詢語法
4.bool
5.filter 後面跟一些過濾條件
6.range
7.must
~

(elasticsearch中的短語語法略多略混亂[至少目前我這個初學者是這樣認為的],這一塊,我準備做個表格或者流程圖來做總結)