1.ElasticSearch基礎概念
1.1 檔案(Doucument)
1.ElasticSearch是面向檔案的,檔案是所有可搜索資料的最小單位
·日志檔案中的日志項
·一本電影的具體資訊/一張唱片的詳細資訊
·MP3播放器里面的一首歌/一遍PDF檔案中的具體內容
2.檔案是會被序列化成JSON格式,報錯在ElasticSearch中
·JSON物件由欄位組成
·每個欄位都有對應的欄位型別(字串/數值/布爾/日期/二進制/范圍型別)
3.每個檔案都有一個Unique ID
·你可以自己指定ID
·或者通過ElasticSearch自動生成
1.2JSON檔案
一篇檔案包含了一系列的欄位,類似資料庫表中一條記錄
JSON檔案格式靈活不需要預先定義格式
·欄位的型別可以指定或者通過ElasticSearch自動推算
·支持陣列/支持嵌套

1.3 檔案的元資料
{
"_index": "my_test_index",
"_type": "test_idnex",
"_id": "AXcpGrIeEQcMCfQJ7Gc5",
"_score": 1,
"_source": {
"testId": "4",
"testName": "zhaoliu"
}
}
元資料,用于標準檔案的相關資訊
- _index 檔案所屬的索引名
- _type 檔案所屬的型別名
- _id 檔案的唯一id
- _source 檔案原始的JSON資料
- _all 整合所有欄位的內容到該欄位,已被作廢
- _version 檔案的版本資訊
- _score 相關性打分
1.4 索引
{
"my_test_index": {
"settings": {
"index": {
"search": {
"slowlog": {
"level": "info",
"threshold": {
"fetch": {
"warn": "200ms",
"trace": "50ms",
"debug": "80ms",
"info": "100ms"
},
"query": {
"warn": "200ms",
"trace": "50ms",
"debug": "80ms",
"info": "100ms"
}
}
}
},
"indexing": {
"slowlog": {
"level": "info",
"threshold": {
"index": {
"warn": "200ms",
"trace": "20ms",
"debug": "50ms",
"info": "100ms"
}
},
"source": "1000"
}
},
"number_of_shards": "5",
"provided_name": "my_test_index",
"creation_date": "1611301841428",
"unassigned": {
"node_left": {
"delayed_timeout": "5m"
}
},
"number_of_replicas": "1",
"uuid": "e5B65ySmQ-GE8Tj9gUHIPw",
"version": {
"created": "5050399"
}
}
}
}
}
- INDEX 索引是檔案的容器是一類檔案的結合
- INDEX 體現了邏輯空間的概念:每個索引都有自己的mapping定義用于定義包含檔案的欄位名和欄位型別
- Shard 體現了物理空間的概念 索引中的資料分散在Shard上
- 索引的Mapping與Settings
- Mapping 定義檔案欄位的型別
- setting 定義不同的資料分布
1.5 Type

- 在7.0之前,一個Index可以設定多個Types
- 6.0開始,Type已經被Deprecated(不推薦使用),從7.0開始一個索引只能創建一個Type - > “_doc”
1.6 抽象與類比
| RDBMS | ElasticSearch |
|---|---|
| Table | Index(Type) |
| Row | Document |
| Column | Filed |
| Schema | Mapping |
| SQL | DSL |
- 在7.0之前 一個Index 可以設定多個Types
- 目前Type 已經被 Deprecated(不推薦使用) ,7.0開始一個索引只能創建一個Type - > “_doc”
- 傳統關系型資料庫和ElasticSearch 的區別
– ElasticSearch - Schemaless /相關性/高性能全文檢索
– RDMS - 事務性/Join
2.節點、集群、分片及副本
2.1 分布式特性
- ElasticSearch 的分布式架構的好處
- 存盤的水平擴容
- 提高系統的可用性,部分節點停止服務整個集群的服務不受影響 - ElasticSearch的分布式架構
- 不同集群通過不同的名字來區分 默認為 “elasticsearch”
- 通過組態檔修改,或者在命令列中 -E cluster.name=geektime 進行設定
- 一個集群可以有一個或者多個節點
2.2 節點
- 節點是一個ElasticSearch 的實體
– 本質上就一個Java行程
– 一臺機器上可以運行多個ElasticSearch行程,但是生產環境一般建議一臺機器只運行一個ElasticSearch 實體 - 每一個節點都有名字 通過組態檔配置或者啟動的時候 -E node.name=node1來指定
- 每一個接在在啟動之后會分配一個UID,保存在data目錄下
2.2.1 Master-eligible nodes(合格節點) 和Master Node(主)
- 每個節點啟動后 默認就是一個 Master eligible節點
- 可以設定node.master:false 禁止
- Master-eligible可以參加選主流程,成為Master節點
- 當第一個節點啟動的時候,它會將自己選舉成Master節點
- 每個節點都保存了集群的狀態,只有Master節點才能修改集群的狀態資訊
- 集群狀態(Cluster State)維護了一個集群中的必要資訊
- 所有節點的資訊
- 所有的索引和其相關的Mapping與Setting資訊
- 分片的路由資訊
- 任意節點都能修改資訊會導致資料的不一致性
- 集群狀態(Cluster State)維護了一個集群中的必要資訊
2.2.2 Data Node & Coordinating Node
- Data Node(資料節點)
- 可以保存資料的節點叫做Data Node 負責保存分片資料,在資料擴展上起到了至關重要的作用
- Coordinating Node(協調節點)
- 負責接收Client請求,將請求分發到合適的節點,最終把結果匯集到一起
- 每個節點默認都起到了 Coordinating Node職責
2.2.3 其他節點
- Hot & Warm Node (參考鏈接Hot & Warm Node)
– 不同硬體配置的Data Node,用來實作 Hot & Warm架構,降低集群部署的成本 - Machine Learning Node(機器學習節點)
– 負責跑 機器學的Job 用來做例外檢測 - Tribe Node (協調節點 充當跨多集群聯合客戶端)
– (5.3 開始使用Cross Cluster Search) Tribe Node 連接到不同的ElasticSearch集群,并且支持將這些集群當成一個單獨的集群
2.2.4 配置節點型別
- 開發環境中一個節點可以承擔多種角色
- 生產環境中,應該設定單一的角色的節點(dedicate node 專用節點)
| 節點型別 | 配置引數 | 默認值 |
|---|---|---|
| maste eligible | node.master | true |
| data | node.data | true |
| ingest | node.ingest | true |
| coordinating only | 無 | 每個節點默認都是coordinating 節點設定其他型別全部為false |
| machine learning | node.ml | true(需enable x-pack) |
2.3 分片(Primary Shard & Replica Shard)
- 主分片,用以解決資料水平擴展的問題,通過主分片,可以將資料分不到集群內的所有節點之上
- 一個分片是一個運行的Lucene的實體
- 主分片數在索引創建時指定,后續不允許修改,除非Reindex
- 副本,用以解決資料高可用的問題,分片是主分片的拷貝
- 副本分片數,可以動態調整
- 增加副本數,還可以在一定程度上提高服務的可用性(讀取的吞吐)
- 一個三節點的集群中,blogs索引的分配分布情況

2.3.1 分片的設定
- 對于生產環境中分配的設定,需要提前做好容量規劃
- 分片數設定過小
- 導致后續無法增加節點實作水平擴展
- 單個分片的資料量大,導致資料重新分配耗時
- 分片數設定過大,7.0卡死,默認主分片設定成1,解決了over-sharding(
shard也是一種資源,shard過多會影響集群的穩定性,因為shard過多,元資訊會變多,這些元資訊會占用堆記憶體,shard過多也會影響讀寫性能,因為每個讀寫請求都需要一個執行緒,所以如果index沒有很大的資料量,不需要設定很多shard,)的問題- 影響搜索結果的相關性打分,影響統計結果的準確性
- 當個節點上過多的分片,會導致資源的浪費同時也會影響性能
- 分片數設定過小
2.4 查看集群的健康狀態
GET _cluster/health
{
"cluster_name": "es-cn-zz11rb9fv000fj1pe",
"status": "green",
"timed_out": false,
"number_of_nodes": 6,
"number_of_data_nodes": 3,
"active_primary_shards": 766,
"active_shards": 1507,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"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": 100
}
GET _cat/nodes
172.17.25.39 45 91 3 0.23 0.08 0.06 di - 3Ja7gZv
172.17.25.53 55 79 1 0.00 0.01 0.05 mi * H1guebi
172.17.25.52 22 78 0 0.01 0.02 0.05 mi - rdjzfmG
172.17.25.51 24 78 0 0.00 0.01 0.05 mi - uaU255o
172.17.25.38 54 91 2 0.23 0.26 0.16 di - wQwmOos
172.17.25.40 65 89 1 0.01 0.17 0.26 di - 4mZ8XK7
GET _cat/shard
companyinfo 4 r STARTED 31408061 38.5gb 172.17.25.38 wQwmOos
companyinfo 4 p STARTED 31408061 40.2gb 172.17.25.39 3Ja7gZv
companyinfo 1 p STARTED 31412834 43.2gb 172.17.25.38 wQwmOos
companyinfo 1 r STARTED 31412834 41.7gb 172.17.25.39 3Ja7gZv
companyinfo 3 r STARTED 31407535 37.6gb 172.17.25.40 4mZ8XK7
companyinfo 3 p STARTED 31407535 36.8gb 172.17.25.39 3Ja7gZv
companyinfo 2 r STARTED 31412927 41.8gb 172.17.25.40 4mZ8XK7
companyinfo 2 p STARTED 31412927 41.2gb 172.17.25.39 3Ja7gZv
companyinfo 0 p STARTED 31400572 40.4gb 172.17.25.40 4mZ8XK7
companyinfo 0 r STARTED 31400572 43.1gb 172.17.25.38 wQwmOos
- Green 主分片和副本都很正常
- Yellow 主分片全部正常分配,有副本分片未能正常分配
- Red 有主分片未能分配
- 例如當服務器的磁盤容量超過85%時 去創建了一個新的索引
3.檔案的CRUD & 批量操作
3.1 檔案的CRUD
- Type名 約定都用_doc
- Create 如果ID已經存在會失敗
- Index 如果ID不存在創建新的檔案否則先洗掉現有的檔案再創建新的檔案 版本會增加
- Update 檔案必須已經存在更新只會對回應欄位做增量修改
3.1.1 Index
PUT my_test_index/_doc/1
{
"user":"mike",
"comment":"You know,for search"
}
- Index和Create 不一樣的地方:如果檔案不存在,就索引新的檔案,否則現有檔案會被洗掉,新的檔案被索引,版本資訊+1
3.1.2 Create
PUT my_test_index/_create/1
{
"user":"mike",
"comment":"You know,for search"
}
POST my_test_index/_doc (不指定ID 自動生成)
{
"user":"mike",
"comment":"You know,for search"
}
- 支持自動生成檔案ID 和指定檔案ID的兩種型別
- 通過呼叫"post /my_test_index/_doc"
- 系統會自動生成document id
3.1.3 Read
GET my_test_indx/_doc/_1
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "my_store",
"_type": "products",
"_id": "5",
"_score": 1,
"_source": {
"price": 10,
"productName": "ZHANGSAN",
"productID": "XHDK-A-1293-#fJ3"
}
}
]
}
- 找到檔案,回傳HTTP 200
- 檔案元資訊
- _index/_type/
- 版本資訊,同一個ID的檔案即使被洗掉,version號也會不斷的增加
- _source 中默認包含了檔案的所有原始資料
- 檔案元資訊
- 找不到檔案 回傳HTTP 404
3.1.4 Update
POST my_test_index/_update/1
{
"doc":{
"user":"mike",
"comment":"You know,ElasticSearch"
}
}
- Update方法不會洗掉原來的檔案,而是實作真正的資料更新
- Post 方法/Payload 需要包含在 “doc” 中
3.1.4 Delete
DELETE my_test_index/_doc/1
3.2 Bulk API

-
支持在一次API呼叫中,對不同的索引進行操作
-
支持四種型別操作
- Index
- Create
- Update
- Delete
-
可以再URI中指定Index 也可以在Payload 中進行
-
操作中單條操作失敗不會影響其他操作
-
回傳結果包括了每一條操作執行的結果
3.3 批量讀取 -mget
批量操作可以減少網路連接所產生的開銷 提高性能


GET /_mget
{
"docs": [{
"_index": "my_store",
"_id": 1
},
{
"_index": "companyinfo",
"_id": "cd5b8daadc31482e84715da912a604f4"
}
]
}
{
"docs": [
{
"_index": "my_store",
"_type": "products",
"_id": "1",
"_version": 4,
"found": true,
"_source": {
"price": 12,
"productID": "XHDK-A-1293-#fJ3"
}
},
{
"_index": "companyinfo",
"_type": "companyinfo",
"_id": "cd5b8daadc31482e84715da912a604f4",
"_version": 1,
"found": true,
"_source": {
"entName": "廣西金朋豪友投資有限公司",
"orgLogo": "",
"regCapital": "500萬元人民幣",
"city": "廣西壯族自治區",
"regDate": "2017-05-17",
"industry": "商務服務業",
"taxpayerIdNo": "91450800MA5L585X6F",
"creditCode": "91450800MA5L585X6F",
"registrationAuthority": "貴港市市場監督管理局",
"staffSize": "",
"orgCode": "MA5L585X-6",
"enterpriseStatus": "存續(在營、開業、在冊)",
"id": "cd5b8daadc31482e84715da912a604f4",
"businessRegCode": "450800000151505",
"email": "",
"introduction": "",
"regCapitalNumber": 500,
"website": "",
"address": "貴港市解放北路龍圣新村小區(四小區213號)一樓",
"town": "",
"bossId": "4b12e1b8d1ef11-p-4b12e276d1ef1",
"corporation": "蒙雪",
"businessScope": "對文化產業、旅游業、旅游商品的投資;對建筑業的投資;企業形象策劃,市場營銷策劃,賽事活動策劃,舞臺造型策劃,婚禮慶典活動策劃;展覽展示服務,會務服務,禮儀服務,攝影服務;網路資訊技術的開發、咨詢、轉讓服務;影視策劃咨詢,企業管理咨詢,投資資訊咨詢(以上專案除國家有專項規定外);電視節目制作服務(具體專案以審批部門批準為準);動漫設計;出版物的零售(具體專案以審批部門批準為準),室內外裝飾裝修工程,建筑工程設計,市政工程,景觀工程設計(以上專案憑資質證經營);餐飲服務(具體專案以審批部門批準為準);設計、制作、代理、發布國內各類廣告;演出經紀(具體專案以審批部門批準的為準);政府采購、招投標代理、工程咨詢、土地評估、房地產評估、資產評估、房地產評估審計、工程預結算,",
"businessTerm": "長期",
"contributedcapital": "",
"checkDate": "2017-05-17",
"enterpriseType": "有限責任公司(自然人獨資)",
"orgNameEn": "",
"taxpayerQualification": "",
"telphone": "",
"district": "",
"sameEnterprise": "<關聯企業3>",
"oldOrgName": "",
"readAddress": "貴港市解放北路龍圣新村小區(四小區213號)一樓",
"contributors": ""
}
}
]
}
3.4 批量查詢 -msearch

3.5常見錯誤回傳
| 問題 | 原因 |
|---|---|
| 無法連接 | 網路故障或集群故障 |
| 連接無法關閉 | 網路故障或節點出錯 |
| 429 | 集群過于繁忙 |
| 4XX | 請求體格式有誤 |
| 500 | 集群內部錯誤 |
4.倒排索引
4.1 正排索引和倒排索引

- 倒排索引包含兩個部分
- 單詞詞典(Term Dictionary),記錄所有檔案的單詞,記錄單詞到倒排串列的關聯關系
- 單詞詞典一般比較大,可以通過B+樹或哈希拉鏈法實作,以滿足高性能的插入和查詢
- 倒排串列(Posting List) 記錄了單詞對應的檔案結合,由倒排索引組成
- 倒排索引項(Posting)
- 檔案ID
- 詞頻 TF 該單詞在檔案中出現的次數用于相關性評分
- 位置(Position) 單詞在檔案中分詞的位置,用于陳述句搜索(phrase query)
- 偏移(Offset) 記錄單詞的開始結束位置,實作高亮顯示
- 倒排索引項(Posting)
- 單詞詞典(Term Dictionary),記錄所有檔案的單詞,記錄單詞到倒排串列的關聯關系

4.2 ElasticSearch的倒排索引
- ElasticSearch的JSON檔案中的每個欄位都有自己的倒排索引
- 可以指定對某些欄位不做索引
- 優點:節省存盤空間
- 缺點:欄位無法被搜索
5.分詞器
5.1 Alalysis 與 Analyzer
- Alalysis 文本分析是把全文本轉換一系列單詞(term/token)的程序,也叫做分詞
- Alalysis 是通過Analyzer來實作的
- 可使用ElasticSearch內置的分析器,或者采用定制化分析器
- 除了在資料寫入時轉換詞條,匹配Query陳述句的時候也需要用相同的分析器對陳述句進行分析

5.2 Analyzer的組成
- 分詞器是專門處理分詞的組件,Analyzer由三部分組成
-Character Filters(針對原始文本處理,例如出去html)/Tokenizer(按照規則切分單詞)/Token Filter(將切分的單詞進行加工,小寫,洗掉stopwords,增加同義詞)

5.3 Elasticsearch的內置分詞器
- Standard Analyzer 一默認分詞器,按詞切分,小寫處理
- Simple Analyzer 一按照非字母切分(符號被過濾),小寫處理
- Stop Analyzer 一小寫處理,停用詞過濾(the,a,is)
- Whitespace Analyzer一按照空格切分,不轉小寫
- Keyword Analyzer 一不分詞,直接將輸入當作輸出
- Patter Analyzer 一正則運算式,黑默認\W+(非字符分隔)
- Language 一提供了30多種常見語言的分詞器
- Customer Analyzer自定義分詞器
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/252112.html
標籤:其他
上一篇:淺談用戶中心-資料庫設計
下一篇:apache 測驗 5
