Elastic Search 學習記錄:
ES Mysql
1.Index 表示索引 1.database 數據庫
2.Type 表示類型 2.table 數據庫某表
3.Document 表示每一條記錄 3.records 數據庫表某一條記錄
4.field 表示記錄的字段 4.coloum 數據庫某個字段
Es中使用PrebuildTransportClient中獲取到的response中的getSourse()得到的才document中的內容!
注意:
外部:如果外部命令中指定了version,那麼一定是要外部的version版本大於Es內部的version版本才能夠正常執行相關指令
內部:如果使用內部指定版本控制,則一定是以內部的版本和外部的版本相同時才能夠正常執行相關指令
它們之間由一個配置來控制: version_type = external 如果開啓這個配置的話表示用外部來做版本控制
控制檯的mapping參數會自動將field的類型自動做綁定,以及對應的字段類型的屬性
String 類型查詢支持分詞
date/long 類型查詢只能夠精確查詢,不支持分詞
可以自動創建 mapping--> 裏面自己去配置每一個field的類型
es默認會爲每一個字段、每一個內容多做索引,如果某些字段不需要索引可以自己將其的index設置爲false
如果在創建document的時候不設置一個id,那麼es會自動爲其創建一個id
max_score爲當前搜索匹配度,最大爲1
查詢:
term查詢 :不知道es有分詞器,只會去找原始的index,適用於integer、date等不分詞的field
terms查詢:知道es有分詞器存在,會將查詢關鍵字分詞,並查詢只要符合其中一個分詞的結果返回給用戶
from:開始位置
size:取多少個
"from" : 0,
"size" : 2,
"query" :{
"term" : {
// 這裏的name代表匹配的field
"name" : ["lisi","zhangsan"]
}
}
match查詢 :match知道有分詞器的存在在查詢的時候會將關鍵字進行分詞,只要doc中滿足一個分詞就能夠將結果返回給用戶
match_phrase : 短語匹配查詢 :{love you} 需要同時匹配上love you兩個詞,同時位置不變才能夠被搜索出來
wildcard : 通配符查詢
fuzzy : 模糊查詢
should : 滿足其中一個條件就行
must : 必須是多個條件都滿足才能被查詢到
must_not : 必須是多個條件都不滿足
"query" : {
"should"/"must"/"must_not" :{
"term" : {
"name" : "zhangsan"
},
"term" : {
"age" : 23
}
}
}
基數 : 互不相同的個數
Es的分片數一定要設置爲節點數的1.5 - 3倍,爲的就是以後做水平擴容的時候講shard負載均衡到每一個node
如果只是數據量的增大就只需要新增部分節點即可,沒有必要增加副本數,因爲增加副本數會導致服務器壓力過大
shard在創建index 的時候就已經確定,無法進行修改
查詢:
1.如果只是查詢,非master上同時擁有此數據那麼可以直接返回,無需經過master。如果被查詢的node上沒有需要查詢的值,那麼會轉發到有和這個值得node上,也無需經過master
2.如果是修改、刪除、新增操作,則需要通過master,master上處理完畢之後,通過路由將這些命令發送給其他的node
3.每一個shard都是一個luence實例,都能夠獨立的穿件index以及處理請求
4.節點增加或者刪除,集羣會自動做shard的負載均衡(node的增加或者刪除)
5.node上一定存在一個主分片以及對應個數副本分片 主分片:primary shard 副本分片:replac 注意:每一個node的主分片和其副本分片不存在於同一個node上
6.如果只有一個node的話,副本分片是沒有辦法被創建的,且此時的集羣健康狀態不樂觀爲 yellow
7.新增node的時候就能夠將之前沒有被創建出來的副本分片創建出來
8.es集羣擴容的極限是:shard + replica = 主分片數 + 副本數
9.宕機容錯性: 容忍一半的服務器宕機 原則:必須保證數據的完整性
提高一個es集羣的容錯性,可以增加它的副本分片數
集羣狀態:
1.全部主分片、全部副本分片都活躍 ---> green
2.全部主分片活躍 ---> yellow
3.非全部主分片活躍 ---> red
容錯機制:
1.選舉新的master
2.將其他未宕機且這個節點上有shard,那麼此時就會找到某個node,將此node上的對應丟失的shard的replica升級爲shard
此時集羣的狀態就會從red ----> 轉爲 yellow
3.此時重啓宕機的node,再將新增的shard副本信息,以及丟失掉的replica信息複製到該啓動的node,此時健康狀態從yellow ---> green
sourse:就是put document進去的那段內容 ,就是 documents
document裏面的修改都是先將原來的document 標記爲deleted , 然後再創建新的document
post方式相比put方式減少了網絡交互的次數,因此post的效率較高。
delete刪除文檔也是將指定的文檔標記爲deleted
注: 在節點或者服務器容量不夠時,集羣會將這些標記爲deleted的數據源刪除點
get 和 query 都不能夠獲取到這個標記爲deleted的文檔
文檔路由:
一般來說集羣中有多個主分片(primary shard),所以我們在存儲數據的時候需要選擇存在哪一個分片上面:
此時這個document就需要指定一個routingKey,通常來說和這個routingKey就是和這個document的_id
路由計算方式: int shardIndex = hash(routingKey) % num_of_primary_shrads;
數據請求的節點:協調節點,因爲不一定新增的數據就是添加在該node,而是得根據文檔路由的算法來計算放在哪個shard上,然後轉發至那個節點!
指定節點存儲數據完畢之後將,將新增數據同步到replica,協調節點向請求者響應,此時纔算完成一個數據請求。
deep paging : 數據分頁中的深度分頁,這裏的深度分頁的流程是將全部的數據發送到協調節點上去重新排序,這樣非常消耗資源、內存。
copyto : 指定字段 (可以將text類型的數據值 copyto 到一個指定的字段,這樣在使用查詢的時候可以使用這個copyto字段,而不需要多個字段都查詢了)
注意: copy to 指定字段的類型一定是text類型
如果對某個字段field制定了type = keyword 那麼該field對應的值就不會被再次分詞。
-socore : 在所有文檔中出現的次數越多,相關度越低。出現的次數越少,相關度越高。
匹配上的text越長,相關度越低。匹配上的text越短,相關度越高。
ES中不僅有倒排索引,同時也擁有正排索引DocValues,需要注意的是這裏的docValues是默認開啓的,只對不可分詞的類型建立正排索引。
scroll : 分批次查詢
yyyy-MM-dd : 如果數據格式爲yyyy-MM-dd格式會被系統默認爲date類型
doc裏面的field類型一旦創建,就無法被修改。
aliaes : 別名關聯 : 可以不重啓解決數據格式問題。
ES連接:
1.現指定集羣: Settings settings = Settings.Builder().put("cluster.name","指定集羣名字").build();
2.創建連接客戶端: TransportClient client = new PreBuildTransportClint(TransportAddress);
3.指定node的address:new TransportAddress(InetAddress.getByName("node名稱 or node的地址",port(9300)));
4.進行相關操作
QueryBuilder 就是ES裏面的指定字段查詢
term--> 指定一個keyword 不分詞
terms--> 可以指定多個查詢keyword,支持分詞
must:必須達成某條件
must_not: 必須不能達成某條件
match:支持分詞查詢
matchAll : 查詢全部
matchParse : 短語查詢
管理工具kibina 或者 head