1. ElasticSearch基本使用
1.1 基本概念
- 集群和節點 :多個節點組成一個集群,每一個集群都有一個唯一的名字,默認為“elasticsearch”,每一個節點都有其自己的名字,但每一個節點都是通過集群的名字來加入集群的
- 索引:含有相同屬性的檔案集合,就相當于sql里面一個database,就是一個資料庫;
- 型別:索引可以定義一個或多個型別,檔案必須屬于一個型別,就相當于sql里面一個table,也就是一個表;索引名要小寫且沒有下劃線
- 檔案:是可以被索引的基本資料單位,相當于sql里面的一條記錄;
- 分片:每個索引都有多個分片,每個分片都是一個Luence索引;分片是為了緩解大資料量的索引所帶來的硬碟壓力,并減少對搜索速度造成的瓶頸;分片允許用戶進行橫向和縱向的擴展
- 備份:拷貝一份分片就完成了分片的備份;可以在主分片失效或者損壞的時候來代替主分片來執行搜索任務,提高ES的可用性,并分攤搜索壓力
- ES在創建是會自動創建五個分片,一個備份;分片的數量只能在創建索引的時候確定,而不能在后期進行修改,而備份可以修改
1.2 RESTFul API
ElasticSearch的API組成示意RESTFul API的風格來命名自己的API的;
API基本格式:http://:/<索引>/<型別>/<檔案id>
常用HTTP動詞:GET/ PUT/ POST/ DELETE
1.3 創建索引
1.3.1 非結構化創建


這里可以查看book這個索引的資訊來看出來,他是結構化還是非結構化的索引

1.3.2 結構化創建

{
"novel": {
"properties": {
"title": {
"type": "text"
}
}
}
}
再去到概覽里面,右上角重繪,之后查看book的索引資訊,就會看到mapping當中有了引數

這里會有一個問題,就是在復合查詢的時候,json格式的資料會很麻煩而且易錯,所以大家可以考慮使用Postman工具來進行API的操作;

{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
},
"mappings":{
"man":{
"properties":{
"name":{
"type":"text"
},
"country":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"data":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
再次重繪Head插件頁面,便會展示出我們剛設定好的索引

1.4 插入操作
1.4.1 指定檔案id插入
還是利用postman工具,訪問people/man/1并輸入接送資料

然后再次重繪Head插件頁面,你會發現people這個索引下面的docs從0變成了1,這便意味著我么插入資料成功了,最上方資料瀏覽選項卡里面便能夠看到我們插入的資料;
1.4.2 自動產生檔案id插入
直接借用上面的資料做一些修改

這個時候你可以去Head頁面去查看了,docs從1變成2了,資料瀏覽也能看到我們剛剛插入的資訊;
1.5 修改操作
1.5.1 直接修改檔案

1.5.2 腳本修改檔案
腳本修改,就是利用ES內置支持的語言,來對檔案內容進行修改;ES自身支持的語言有:painless,groovy,JavaScript以及python;

當然也可以把引數提取出來,單獨寫
{
"script":{
"lang":"painless",
"inline":"ctx._source.age = params.age",
"params":{
"age":100
}
}
}
1.6 洗掉操作
1.6.1 洗掉檔案
洗掉檔案的操作就很簡單,只需要在postman中輸入想要洗掉的檔案id的路徑,發送一個delete請求就可以了

1.6.2 洗掉索引
洗掉索引就屬于一種敏感操作,一旦洗掉,就會失去該索引下面所有的資料;
洗掉操作你可以直接在head界面里,在你想要洗掉的索引下面動作下拉欄里面去洗掉


當然你也可以在postman中進行洗掉,類似洗掉檔案,你只需要把路徑保留到你要洗掉的索引,發送delete請求即可;

上面兩個步驟執行完成后,就把之前創建的兩個索引都刪掉了,此時再來head來查看,就不再有任何的資料了;

1.7 查詢操作
1.7.1 準備作業
? 我們上面的操作已經清空了我們ES,這里為了方便我們后面的查詢操作,我預先構建了一個索引,這里我只放出結構,希望大家能夠自己動手去創建一下,以加深印象


1.7.2 簡單查詢
顧名思義,簡單查詢就只需要輸入路徑加你想要查詢的id,發送get請求即可

1.7.3 條件查詢
添加查詢就是發送一些你設定好的條件引數,然后post發送這些引數,等待ES查詢結果

這里先簡單說明一下里面的一些引數是什么意思,具體的語法在后面會詳細講解
{
// 查詢
"query":{
// 匹配所有
"match_all":{},
// 匹配(按條件)
"match":{
"title":"Java"
}
},
// 從哪開始
"from":1,
// 資料個數
"size":2,
// 自定義排序
"sort":[
// 出版日期,降序
{"publish_date":{"order":"desc"}}
]
}
1.7.4 聚合查詢
{
// 聚合查詢關鍵字
"aggs":{
// 自定義查詢名稱(可以多個)
"group_by_word_count":{
// 關鍵詞,聚合
"terms":{
// 指定聚合欄位
"field":"word_count"
},
// 關鍵詞,計算
"stats":{
"field":"word_count"
}
}
}
}

最下面便是聚合資訊,相同字數的資料便被聚合在了一起;
2. ElasticSearch高級使用
query,filter語法
2.1 子條件查詢
子條件查詢就是以特定欄位查詢所指特定值:分為Query Context和Filter Context
-
Query Context
在查詢程序中,除了判斷檔案是否滿足查詢條件外,ES還會計算一個_sorce來表示匹配度,旨在判斷目標檔案和查詢條件匹配的有多好
a. 全文本查詢:針對文本型別資料;
{ // 查詢 "query":{ // 匹配所有 "match_all":{}, // 匹配(按條件模糊搜索) "match":{ "title":"Java" }, // 精確匹配 "match_phrase":{ "title":"Java" }, // 組合搜索 "multi_match":{ // 搜索內容 "query":"", // 搜索范圍 "fields":[] }, // 語法查詢(支持通配符,布爾查詢等) "quer _string":{ // 搜索內容(利用AND或者OR來進行連接) "query":"", // 搜索范圍 "fields":[] } } }b. 欄位查詢:針對結構化資料,如數字,日期等;
{ // 查詢 "query":{ // 范圍查詢 "range":{ "word_count":{ // 大于等于(greater than or equal) "gte":1000, // 小于等于 "lte":10000 } } } } -
Filter Context
在查詢程序中,只判斷該檔案是否滿足條件,只有YES或NO;filter基本上就是用來做資料過濾的,比query要快一些,但是要結合bool來使用,結果會被ES進行快取;
{ // 查詢 "query":{ // bool關鍵字 "bool":{ // filter關鍵詞 "filter":{ // 過濾條件 "trem":{ } } } } }
2.2 復合條件查詢
復合條件查詢就是以一定的邏輯組合子條件查詢,常見的包括:固定分數查詢,布爾查詢等等;
{
"query":{
// 固定分數查詢
"constant_score":{
// 過濾
"filter":{
"match":{
}
},
// 指定分數
"boost": 1
},
// 布爾查詢
"bool":{
// 應當滿足的條件
"shoule":[
// 多個條件之間為或
],
// 必須滿足的條件
"must":[
// 多個條件之間為與
],
// 必須不能滿足
"must_not":[
]
// 這些都可以和filter進行組合,再進一步篩選
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262165.html
標籤:其他
上一篇:Qt 工具 windeployqt 自動打包 exe 程式
下一篇:【Grasshopper基礎8】電池的序列化與反序列化 Serilization of Grasshopper Component
