Elasticsearch 安裝|使用|語法|介紹

一.啓動elasticsearch
/**
1.在elasticsearch安裝目錄的bin目錄上,按shif+t右鍵,在此處打開命令行窗口,
2.輸入:elasticsearch.bat,回車
3.服務器中輸入:localhost:9200 ,查看結果
*/
{
  "name" : "YG6iddi",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "fw8DvwVSR3i6mcPqDFfmpw",
  "version" : {
    "number" : "6.5.3",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "159a78a",
    "build_date" : "2018-12-06T20:11:28.826501Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
//啓動成功

二.啓動Kibana-sense工具
/**
1.在elasticsearch安裝目錄的bin目錄中,雙擊kibana.bat,kibana
2.在服務器中輸入:localhost:5601 查看結果
3.點擊菜單:Dev Tools 菜單
4.在console 寫操作命令即可,自動保存,頁面刷新也不回丟失:
*/

三、索引特定類型信息
/**
0.新建索引類型
1.每個家庭成員索引一個文檔,包含該成員的所有信息。
2.每個文檔都將是 family 類型 。
3.該類型位於 索引 kibana_1 內。
4.該索引保存在我們的 Elasticsearch 集羣中。
5.索引的文檔是不可變的:他們不能被修改,只能被替換,重新索引
*/
//操作如下
PUT /kibana_1/family/1
{
    "first_name" : "張",
    "last_name" :  "一",
    "age" :        29,
    "about" :      "I love she",
    "interests": [ "food", "sleep" ]
}
//kibana_1:索引名稱
//family:類型名稱
//1:特定成員ID
 
//如果希望id自動生成,把PUT改成POST即可,此時id爲20個字符的GUID字符串
POST /kibana_1/family
	"first_name" : "張",
    "last_name" :  "一",
    "age" :        29,
    "about" :      "I love she",
    "interests": [ "food", "sleep" ]
}
 四、檢索索引值
 
//1.所有索引檢索
GET _search
{
  "query": {
    "match_all": {}
  }
}
//2特定索引,特定family類型檢索
GET kibana_1/family/_search
{
  "query":{
    "match_all": {}
  }
  
}
//3.根據id檢索
GET kibana_1/family/1
//返回結果包含元數據,以及_source屬性,內容是family成員原始JSON文檔
{
  "_index" : "kibana_1",
  "_type" : "family",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "first_name" : "張",
    "last_name" : "一",
    "age" : 29,
    "about" : "I love she",
    "interests" : [
      "food",
      "sleep"
    ]
  }
}
//4.id拓展檢索
GET kibana_1/family/1/_source //(僅_source)
GET /kibana_1/family/1?_source //(信息全)
GET /kibana_1/family/1?_source=first_name,about //(查詢_source指定字段)
//5.指定參數檢索
/**
查詢年齡爲29歲的成員信息,採用高亮搜索,很容易查找,
一般涉及一個查詢字符串(_query-string_),通過url來傳遞參數,
注意,參數不支持中文匹配
*/
GET /kibana_1/family/_search?q=age: 29
//6.查詢表達式檢索(外層括號{}要單獨成行)
GET kibana_1/family/_search
{
	"query" :{
		"match":{
			"age":29
		}
	}
	
}
//7.複雜檢索,
/**
使用過濾器,高效執行結構化查詢,過濾出年齡大於30且小於52,且about爲"I love she"的成員
match部分和之前一樣,range部門是一個過濾器
*/
GET kibana_1/family/_search
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "about" : "I love she" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30,"lt":52 } 
                }
            }
        }
    }
}
//8.全文搜索
/**
如果搜索無固定條件,而是根據個別單詞取匹配,比如about中爲him的成員
傳統數據庫很難搞定,但是es就很輕鬆,Elasticsearch 默認按照相關性得分排序,匹配度越高,位置越靠前
*/
GET kibana_1/family/_search
{
  "query": {
    "match": {
      "about": "him"
    }
  }
}
//9.短語匹配
/**
有時候想要精確匹配一系列單詞或者短語 。 
比如, 我們想執行這樣一個查詢,僅匹配同時包含 “rock” 和 “climbing” ,並且 二者以短語 love she 的形式緊挨着的家庭成員記錄。
*/
GET kibana_1/family/_search
{
  "query": {
    "match_phrase": {
      "about": "love she"
    }
  }
}
//10.高量查詢
/**
許多應用都傾向於在每個搜索結果中 高亮 部分文本片段,以便讓用戶知道爲何該文檔符合查詢條件。
在 Elasticsearch 中檢索出高亮片段也很容易。
返回結果與之前一樣,與此同時結果中還多了一個叫做 highlight 的部分,這個部分包含了 about 屬性匹配的文本片段,並以 HTML 標籤 <em></em> 封裝:
*/
GET kibana_1/family/_search
{
  "query": {
    "match_phrase": {
      "about": "love she"
    }
  },
  "highlight": {
    "fields": {
      "about": {}
    }
  }
}
/**
多出的部門,和_source並列
"highlight" : 
{
  "about" : [
	"I <em>love</em> <em>she</em>"
  ]
}
*/
//11.分析聚合功能

五、集羣健康狀況
/**
Elasticsearch 的集羣監控信息中包含了許多的統計數據,其中最爲重要的一項就是 集羣健康 , 它在 status 字段中展示爲 green 、 yellow 或者 red 。
status 字段是我們最關心的,指示着當前集羣在總體上是否工作正常。它的三種顏色含義如下:
1.green-所有的主分片和副本分片都正常運行。
2.yellow-所有的主分片都正常運行,但不是所有的副本分片都正常運行。
3.red-有主分片沒能正常運行。
後續會講解什麼是主分片、副分片相關信息
*/
//集羣健康狀態查看
GET /_cluster/health
//結果如下:
{
  "cluster_name" : "elasticsearch",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 6,
  "active_shards" : 6,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 5,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 54.54545454545454
}
六、索引介紹
/**
索引:保存相關數據的地方。我們往Elasticsearch添加數據的時候,需要用到索引。索引實際上是指向一個或多個物理分片的邏輯命名空間。
分片:一個分片是一個底層的工作單元,它保存了全部數據的一部分,一個分片是一個Lucene實例,它本身就是一個很完整的搜索引擎,我們的文檔
	    被存儲和索引到分片內,但是應用程序是直接和索引打交道的,而不是直接與分片進行交互。
		一個分片可以是主分片或者副分片,索引內任意一個文檔都歸屬於一個主分片,所以主分片的個數決定者索引能夠存儲的最大數據量
		notes:技術上而言,一個主分片最大可存儲integer.MAX_VALUE-128個文檔,但實際最大值還要參考你的使用場景,比如硬件、文檔的大小和複雜程度等
副分片:主分片的拷貝。副分片作爲硬件故障時保護數據不丟失的冗餘備份,併爲搜索和返回文檔等讀操作提供服務。
分片數:主分片的個數,在索引建立時就已經確定了,但副分片的個數可以隨時修改。
*/
//1.創建一個索引
/**
分配三個主分片和一個副分片(每個主分片有一個副分片)
默認的話,會被分配5個主分片shards
*/
PUT /es_index_1
{
   "settings" : {
      "number_of_shards" : 3,
      "number_of_replicas" : 1
   }
}
//結果如下:
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "es_index_1"
}
//查詢下索引es_index_1
GET /es_index_1/_search
//結果如下:
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}
//2.列表展示所有索引
GET _cat/indices
//3.刪除指定索引
DELETE 索引名(多個索引用逗號隔開)
//4.判斷一個索引是否存在
/**存在:200 - OK,不存在:404 - Not Found,存在與否,只是判斷當前檢查時的狀態,當前不存在,下一秒也可能存在*/
HEAD /kibana_1/family/1
//5.刪除指定id的索引值
/**存在:200 - OK,不存在:404 - Not Found*/
DELETE /kibana_1/family/1

七、處理衝突
同時索引一個文檔內容時,出現衝突情況,造成一方數據錯誤
//1. 悲觀併發控制
/**
這種方法被關係型數據庫廣泛使用,它假定有變更衝突可能發生,因此阻塞訪問資源以防止衝突。 一個典型的例子是讀取一行數據之前先將其鎖住,
確保只有放置鎖的線程能夠對這行數據進行修改。
*/
//2.樂觀併發控制
/**
Elasticsearch 中使用的這種方法假定衝突是不可能發生的,並且不會阻塞正在嘗試的操作。 然而,如果源數據在讀寫當中被修改,更新將會失敗。
應用程序接下來將決定該如何解決衝突。 例如,可以重試更新、使用新的數據、或者將相關情況報告給用戶。
*/
//3.樂觀併發控制方式
/**
每個文檔都有一個 _version (版本)號,當文檔被修改時版本號遞增。 Elasticsearch 使用這個 _version 號來確保變更以正確順序得到執行
注意,此時要求:version參數必須等於(==)當前實際_version,才能修改成功
*/
//此時version爲1,設置成功
PUT /es_index_1/blog/version=2
{
  "title": "My first blog entry",
  "text":  "Starting to get the hang of this..."
}
//此時會出錯,409-衝突,version參數必須等於(==)當前實際version,才能修改成功
PUT /es_index_1/blog/1?version=1
{
  "title": "My first blog entry",
  "text":  "Starting to get the hang of this..."
}
//4.通過外部系統使用版本控制
/**注意,此時要求:version參數必須大於(>)當前實際version,才能修改成功,否則報錯*/
//此時設置外部version=5成功
PUT /es_index_1/blog/2?version=5&version_type=external
{
  "title": "My first external blog entry",
  "text":  "This is a piece of cake..."
}
//此時會出錯,409-衝突,version參數必須大於(>)當前實際version,才能修改成功
PUT /es_index_1/blog/2?version=5&version_type=external
{
  "title": "My first external blog entry",
  "text": 
  "This is a piece of cake..."
}
//
POST /es_index_1/blog/1/_update
{
   "doc" : {
      "tags" : [ "testing" ],
      "views": 0
   }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章