ElasticSearch的使用二(基本使用篇)

ElasticSearch的客戶端操作

實際開發中,主要有三種方式可以作爲elasticsearch服務的客戶端:
第一種,elasticsearch-head插件
第二種,使用elasticsearch提供的Restful接口直接訪問
第三種,使用elasticsearch提供的API進行訪問

安裝Postman工具

Postman中文版是postman這款強大網頁調試工具的windows客戶端,提供功能強大的Web API & HTTP 
請求調試。軟件功能非常強大,界面簡潔明晰、操作方便快捷,設計得很人性化。Postman中文版能夠發
送任何類型的HTTP 請求 (GET, HEAD, POST, PUT..),且可以附帶任何數量的參數。

下載Postman工具
Postman官網:https://www.getpostman.com
在這裏插入圖片描述
註冊Postman工具
也可以不註冊,直接使用
在這裏插入圖片描述
在這裏插入圖片描述

使用Postman工具進行Restful接口訪問

ElasticSearch的接口語法

curl ‐X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' ‐d '<BODY>'

其中:
在這裏插入圖片描述
創建索引index和映射mapping
請求url:PUT localhost:9200/blog1
請求體:

{
    "mappings": {
        "article": {
            "properties": {
                "id": {
                 "type": "long",    
                    "store": true,
                    "index":"not_analyzed"
                },
                "title": {
                 "type": "text",    
                    "store": true,
                    "index":"analyzed",
                    "analyzer":"standard"
                },
                "content": {
                 "type": "text",    
                    "store": true,
                    "index":"analyzed",
                    "analyzer":"standard"
                }
            }
        }
    }
}

postman截圖:
請求內容如果有問題,text格式改成json
在這裏插入圖片描述
elasticsearch-head查看:
在這裏插入圖片描述
創建索引後設置Mapping
我們可以在創建索引時設置mapping信息,當然也可以先創建索引然後再設置mapping。
在上一個步驟中不設置maping信息,直接使用put方法創建一個索引,然後設置mapping信息。請求的url:POST http://127.0.0.1:9200/blog2/hello/_mapping
請求體:

{
    "hello": {
            "properties": {
                "id":{
                 "type":"long",    
                 "store":true    
                },
                "title":{
                 "type":"text",    
                 "store":true,    
                 "index":true,    
                 "analyzer":"standard"    
                },
                "content":{
                 "type":"text",    
                 "store":true,
                 "index":true,    
                 "analyzer":"standard"    
                }
            }
        }
  }

PostMan截圖
在這裏插入圖片描述
刪除索引index
請求url:DELETE localhost:9200/blog1
postman截圖:
在這裏插入圖片描述
elasticsearch-head查看:
在這裏插入圖片描述
創建文檔document
請求url:POST localhost:9200/blog1/article/1
請求體:

{
"id":1,    
"title":"ElasticSearch是一個基於Lucene的搜索服務器",    
"content":"它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用
Java開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計
算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。"
}

postman截圖:
在這裏插入圖片描述
elasticsearch-head查看:
在這裏插入圖片描述
修改文檔document
請求url:POST localhost:9200/blog1/article/1
請求體:

{
"id":1,    
"title":"【修改】ElasticSearch是一個基於Lucene的搜索服務器",    
"content":"【修改】它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引
擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。"
}

postman截圖:
在這裏插入圖片描述
elasticsearch-head查看:
在這裏插入圖片描述
刪除文檔document
請求url:DELETE localhost:9200/blog1/article/1
postman截圖:
在這裏插入圖片描述
elasticsearch-head查看:
在這裏插入圖片描述
查詢文檔-根據id查詢
請求url:GET localhost:9200/blog1/article/1
postman截圖:
在這裏插入圖片描述
查詢文檔-querystring查詢
請求url:POST localhost:9200/blog1/article/_search
請求體:

{
    "query": {
        "query_string": {
            "default_field": "title",
            "query": "搜索服務器"
        }
    }
}

postman截圖:
在這裏插入圖片描述
注意:將搜索內容"搜索服務器"修改爲"鋼索",同樣也能搜索到文檔,該原因會在下面講解中得到答案

{
    "query": {
        "query_string": {
            "default_field": "title",
            "query": "鋼索"
        }
    }
}

查詢文檔-term查詢
請求url:POST localhost:9200/blog1/article/_search
請求體:

{
    "query": {
        "term": {
            "title": "搜索"
        }
    }
}

postman截圖:
在這裏插入圖片描述

IK分詞器和ElasticSearch集成使用

上述查詢存在問題分析
在進行字符串查詢時,我們發現去搜索"搜索服務器"和"鋼索"都可以搜索到數據;而在進行詞條查詢時,我們搜索"搜索"卻沒有搜索到數據;究其原因是ElasticSearch的標準分詞器導致的,當我們創建索引時,字段使用的是標準分詞器:

{
    "mappings": {
        "article": {
            "properties": {
                "id": {
                 "type": "long",    
                    "store": true,
                    "index":"not_analyzed"
                },
                "title": {
                 "type": "text",    
                    "store": true,
                    "index":"analyzed",
                    "analyzer":"standard" //標準分詞器   
                },
                "content": {
                 "type": "text",    
                    "store": true,
                    "index":"analyzed",
                    "analyzer":"standard" //標準分詞器   
                }
            }
        }
    }
}

例如對 “我是程序員” 進行分詞標準分詞器分詞效果測試:
http://127.0.0.1:9200/_analyze?analyzer=standard&pretty=true&text=我是程序員
分詞結果:

{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "程",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "序",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "員",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    }
  ]
}

而我們需要的分詞效果是:我、是、程序、程序員這樣的話就需要對中文支持良好的分析器的支持,支持中文分詞的分詞器有很多,word分詞器、庖丁解牛、盤古分詞、Ansj分詞等,但我們常用的還是下面要介紹的IK分詞器。

IK分詞器簡介

IKAnalyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始,
IKAnalyzer已經推出 了3個大版本。最初,它是以開源項目Lucene爲應用主體的,結合詞典分詞和文法分析算法的
中文分詞組件。新版本的IKAnalyzer3.0則發展爲 面向Java的公用分詞組件,獨立於Lucene項目,同時提供了對
Lucene的默認優化實現。
IK分詞器3.0的特性如下:
1)採用了特有的“正向迭代最細粒度切分算法“,具有60萬字/秒的高速處理能力。 2)採用了多子處理器分析模
式,支持:英文字母(IP地址、Email、URL)、數字(日期,常用中文數量詞,羅馬數字,科學計數法),中文
詞彙(姓名、地名處理)等分詞處理。 3)對中英聯合支持不是很好,在這方面的處理比較麻煩.需再做一次查詢,同
時是支持個人詞條的優化的詞典存儲,更小的內存佔用。 4)支持用戶詞典擴展定義。 5)針對Lucene全文檢索優
化的查詢分析器IKQueryParser;採用歧義分析算法優化查詢關鍵字的搜索排列組合,能極大的提高Lucene檢索的
命中率。

ElasticSearch集成IK分詞器

IK分詞器的安裝
下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
在這裏插入圖片描述
解壓,將解壓後的elasticsearch文件夾拷貝到elasticsearch-5.6.8\plugins下,並重命名文件夾爲analysis-ik
在這裏插入圖片描述
重新啓動ElasticSearch,即可加載IK分詞器
在這裏插入圖片描述

IK分詞器測試

IK提供了兩個分詞算法ik_smart 和 ik_max_word其中 ik_smart 爲最少切分ik_max_word爲最細粒度劃分我們分別來試一下
最小切分:在瀏覽器地址欄輸入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序員
輸出的結果爲:

{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "程序員",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    }
  ]
}

最細切分:在瀏覽器地址欄輸入地址http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序員
輸出的結果爲:

{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "程序員",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "程序",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "員",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "CN_CHAR",
      "position" : 4
    }
  ]
}

修改索引映射mapping

重建索引
刪除原有blog1索引DELETE localhost:9200/blog1
創建blog1索引,此時分詞器使用ik_max_word
PUT localhost:9200/blog1

{
    "mappings": {
        "article": {
            "properties": {
                "id": {
                 "type": "long",    
                    "store": true,
                    "index":"not_analyzed"
                },
                "title": {
                 "type": "text",    
                    "store": true,
                    "index":"analyzed",
                    "analyzer":"ik_max_word"
                },
                "content": {
                 "type": "text",    
                    "store": true,
                    "index":"analyzed",
                    "analyzer":"ik_max_word"
                }
            }
        }
    }
}

創建文檔POST localhost:9200/blog1/article/1

{
"id":1,    
"title":"ElasticSearch是一個基於Lucene的搜索服務器",    
"content":"它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用
Java開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計
算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。"
}

再次測試queryString查詢
query_string查詢是將query字符串進行分詞,然後去索引庫中匹配要查詢的字段。
請求url:POST localhost:9200/blog1/article/_search
請求體:

{
    "query": {
        "query_string": {
            "default_field": "title",
            "query": "搜索服務器"
        }
    }
}

postman截圖:
在這裏插入圖片描述
將請求體搜索字符串修改爲"鋼索",再次查詢:

{
    "query": {
        "query_string": {
            "default_field": "title",
            "query": "鋼索"
        }
    }
}

postman截圖:
在這裏插入圖片描述
再次測試term測試
term查詢,會將要查詢的索引庫字段例如title進行分詞,然後去匹配term條件。
請求url:POST localhost:9200/blog1/article/_search
請求體:

{
    "query": {
        "term": {
            "title": "搜索"
        }
    }
}

postman截圖:
在這裏插入圖片描述

ElasticSearch集羣

ES集羣是一個 P2P類型(使用 gossip 協議)的分佈式系統,除了集羣狀態管理以外,其他所有的請求都可以發送到
集羣內任意一臺節點上,這個節點可以自己找到需要轉發給哪些節點,並且直接跟這些節點通信。所以,從網絡架
構及服務配置上來說,構建集羣所需要的配置極其簡單。在 Elasticsearch 2.0 之前,無阻礙的網絡下,所有配置了
相同 cluster.name 的節點都自動歸屬到一個集羣中。2.0 版本之後,基於安全的考慮避免開發環境過於隨便造成的
麻煩,從 2.0 版本開始,默認的自動發現方式改爲了單播(unicast)方式。配置裏提供幾臺節點的地址,ES 將其視作
gossip router 角色,藉以完成集羣的發現。由於這只是 ES 內一個很小的功能,所以 gossip router 角色並不需要
單獨配置,每個 ES 節點都可以擔任。所以,採用單播方式的集羣,各節點都配置相同的幾個節點列表作爲 router
即可。
集羣中節點數量沒有限制,一般大於等於2個節點就可以看做是集羣了。一般處於高性能及高可用方面來考慮一般
集羣中的節點數量都是3個及3個以上。

集羣的相關概念
集羣 cluster

一個集羣就是由一個或多個節點組織在一起,它們共同持有整個的數據,並一起提供索引和搜索功能。一
個集羣由一個唯一的名字標識,這個名字默認就是“elasticsearch”。這個名字是重要的,因爲一個節點只
能通過指定某個集羣的名字,來加入這個集羣

節點 node

一個節點是集羣中的一個服務器,作爲集羣的一部分,它存儲數據,參與集羣的索引和搜索功能。和集羣類似,一
個節點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啓動的
時候賦予節點。這個名字對於管理工作來說挺重要的,因爲在這個管理過程中,你會去確定網絡中的哪些服務器對
應於Elasticsearch集羣中的哪些節點。
一個節點可以通過配置集羣名稱的方式來加入一個指定的集羣。默認情況下,每個節點都會被安排加入到一個叫
做“elasticsearch”的集羣中,這意味着,如果你在你的網絡中啓動了若干個節點,並假定它們能夠相互發現彼此,
它們將會自動地形成並加入到一個叫做“elasticsearch”的集羣中。
在一個集羣裏,只要你想,可以擁有任意多個節點。而且,如果當前你的網絡中沒有運行任何Elasticsearch節點,
這時啓動一個節點,會默認創建並加入一個叫做“elasticsearch”的集羣。

分片和複製 shards&replicas

一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引佔據1TB的磁盤空間,而任
一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。爲了解決這個問題,Elasticsearch提供
了將索引劃分成多份的能力,這些份就叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每
個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到集羣中的任何節點上。分片很重要,主
要有兩方面的原因: 1)允許你水平分割/擴展你的內容容量。 2)允許你在分片(潛在地,位於多個節點上)之上
進行分佈式的、並行的操作,進而提高性能/吞吐量。
至於一個分片怎樣分佈,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對於作爲用戶的你來說,
這些都是透明的。
在一個網絡/雲的環境裏,失敗隨時都可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者由於任何原因
消失了,這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。爲此目的,Elasticsearch允許你創建分
片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。
複製之所以重要,有兩個主要原因: 在分片/節點失敗的情況下,提供了高可用性。因爲這個原因,注意到複製分
片從不與原/主要(original/primary)分片置於同一節點上是非常重要的。擴展你的搜索量/吞吐量,因爲搜索可以
在所有的複製上並行運行。總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)
或多次。一旦複製了,每個索引就有了主分片(作爲複製源的原來的分片)和複製分片(主分片的拷貝)之別。分
片和複製的數量可以在索引創建的時候指定。在索引創建之後,你可以在任何時候動態地改變複製的數量,但是你
事後不能改變分片的數量。
默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味着,如果你的集羣中至少有兩個節
點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。

集羣的搭建
準備三臺elasticsearch服務器
創建elasticsearch-cluster文件夾,在內部複製三個elasticsearch服務,要將每個文件裏的data目錄刪除。
修改每臺服務器配置
修改elasticsearch-cluster\node*\config\elasticsearch.yml配置文件
node1節點:

#節點1的配置信息:
#集羣名稱,保證唯一
cluster.name: my‐elasticsearch
#節點名稱,必須不一樣
node.name: node‐1
#必須爲本機的ip地址
network.host: 127.0.0.1
#服務端口號,在同一機器下必須不一樣
http.port: 9200
#集羣間通信端口號,在同一機器下必須不一樣
transport.tcp.port: 9300
#設置集羣自動發現機器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]

node2節點:

#節點2的配置信息:
#集羣名稱,保證唯一
cluster.name: my‐elasticsearch
#節點名稱,必須不一樣
node.name: node‐2
#必須爲本機的ip地址
network.host: 127.0.0.1
#服務端口號,在同一機器下必須不一樣
http.port: 9201
#集羣間通信端口號,在同一機器下必須不一樣
transport.tcp.port: 9301
#設置集羣自動發現機器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]

node3節點:

#節點3的配置信息:
#集羣名稱,保證唯一
cluster.name: my‐elasticsearch
#節點名稱,必須不一樣
node.name: node‐3
#必須爲本機的ip地址
network.host: 127.0.0.1
#服務端口號,在同一機器下必須不一樣
http.port: 9202
#集羣間通信端口號,在同一機器下必須不一樣
transport.tcp.port: 9302
#設置集羣自動發現機器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]

啓動各個節點服務器
雙擊elasticsearch-cluster\node*\bin\elasticsearch.bat
啓動節點1:
在這裏插入圖片描述
啓動節點2:
在這裏插入圖片描述
啓動節點3:
在這裏插入圖片描述
集羣測試
添加索引和映射PUT localhost:9200/blog1

{
    "mappings": {
        "article": {
            "properties": {
                "id": {
                 "type": "long",    
                    "store": true,
                    "index":"not_analyzed"
                },
                "title": {
                 "type": "text",
                    "store": true,
                    "index":"analyzed",
                    "analyzer":"standard"
                },
                "content": {
                 "type": "text",    
                    "store": true,
                    "index":"analyzed",
                    "analyzer":"standard"
                }
            }
        }
    }
}

添加文檔
POST localhost:9200/blog1/article/1

{
"id":1,    
"title":"ElasticSearch是一個基於Lucene的搜索服務器",    
"content":"它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java
開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時
搜索,穩定,可靠,快速,安裝使用方便。"
}

使用elasticsearch-header查看集羣情況
0-4中黑色邊框粗的是主節點,細的是從節點。主從節點分佈在不同的服務器,主節點壞了,從節點可以正常工作。一個索引庫默認爲了5個節點,相當於是分成5塊,然後每塊都有分節點。高可用,負載均衡的目的。
在這裏插入圖片描述

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