ElasticSearch 基礎知識一

第一、ElasticSearch 簡介

           Elaticsearch,簡稱爲eses是一個開源的高擴展的分佈式全文檢索引擎,它可以近乎實時的存儲、檢索數據;本
身擴展性很好,可以擴展到上百臺服務器,處理PB級別的數據。es也使用Java開發並使用Lucene作爲其核心來實
現所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜索變得
簡單
 
1.1 ElasticSearch 應用場景
1、2013年初,GitHub拋棄了Solr,採取ElasticSearch 來做PB級的搜索。 “GitHub使用ElasticSearch搜索20TB
的數據,包括13億文件和1300億行代碼
2、維基百科:啓動以elasticsearch爲基礎的核心搜索架構
3、SoundCloud“SoundCloud使用ElasticSearch1.8億用戶提供即時而精準的音樂搜索服務
4、百度:百度目前廣泛使用ElasticSearch作爲文本數據分析,採集百度所有服務器上的各類指標數據及用戶自
定義數據,通過對各種數據進行多維分析展示,輔助定位分析實例異常或業務層面異常。目前覆蓋百度內部
20多個業務線(包括casio、雲分析、網盟、預測、文庫、直達號、錢包、風控等),單集羣最大100臺機
器,200ES節點,每天導入30TB+數據
5、新浪使用ES 分析處理32億條實時日誌
6、阿里使用ES 構建挖財自己的日誌採集和分析體系
 
1.3 ElasticSearch 與Solr 對比:
1、Solr 利用 Zookeeper 進行分佈式管理,而 Elasticsearch 自身帶有分佈式協調管理功能;
2、 Solr 支持更多格式的數據,而 Elasticsearch 僅支持json文件格式;
3、 Solr 官方提供的功能更多,而 Elasticsearch 本身更注重於核心功能,高級功能多有第三方插件提供
4、Solr 在傳統的搜索應用中表現好於 Elasticsearch,但在處理實時搜索應用時效率明顯低於 Elasticsearch

第二、Windows 安裝ElasticSearch 服務

1、解壓開即安裝完畢,解壓後的ElasticSearch 的目錄結構如下:
2、啓動ElasticSearch 服務
點擊ElasticSearch下的bin目錄下的elasticsearch.bat啓動,控制檯顯示的日誌信息如下:
注意:9300是tcp通訊端口,集羣間和TCPClient都執行該端口,9200是http協議的RESTful接口 。
通過瀏覽器訪問ElasticSearch服務器,看到如下返回的json信息,代表服務啓動成功:

 

第三、安裝ElasticSearch的圖形化界面插件

ElasticSearch不同於Solr自帶圖形化界面,我們可以通過安裝ElasticSearchhead插件,完成圖形化界面的效 果,完成索引數據的查看。安裝插件的方式有兩種,在線安裝和本地安裝。本文檔採用本地安裝方式進行head插 件的安裝。elasticsearch-5-*以上版本安裝head需要安裝nodegrunt

1)下載head插件:https://github.com/mobz/elasticsearch-head
2)將elasticsearch-head-master壓縮包解壓到任意目錄,但是要和elasticsearch的安裝目錄區別開
3)下載nodejshttps://nodejs.org/en/download/
      雙擊安裝程序,步驟截圖如下:
     
      
      

       

      

      安裝完畢,可以通過cmd控制檯輸入:node -v 查看版本號

5)將grunt安裝爲全局命令 ,Grunt是基於Node.js的項目構建工具
cmd控制檯中輸入如下執行命令:
npm install ‐g grunt‐cli
執行結果如下圖:
6)進入elasticsearch-head-master目錄啓動head,在命令提示符下輸入命令:
>cnpm install
>grunt server
7)打開瀏覽器,輸入 http://localhost:9100,看到如下頁面:
如果不能成功連接到es服務,需要修改ElasticSearchconfifig目錄下的配置文件:confifig/elasticsearch.yml,增加
以下兩句命令:
http.cors.enabled: true

http.cors.allow-origin: "*"
然後重新啓動ElasticSearch服務。

 

第四、ElasticSearch相關概念(術語)

4.1 概述

Elasticsearch是面向文檔(document oriented)的,這意味着它可以存儲整個對象或文檔(document)。然而它不僅
僅是存儲,還會索引(index)每個文檔的內容使之可以被搜索。在Elasticsearch中,你可以對文檔(而非成行成列的
數據)進行索引、搜索、排序、過濾。Elasticsearch比傳統關係型數據庫如下:

4.2 ElasticSearch 核心概念

索引 index
一個索引就是一個擁有幾分相似特徵的文檔的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索
引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這
個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集羣中,可以定義任意多的索
引。
 
類型 type
在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來
定。通常,會爲具有一組共同字段的文檔定義一個類型。比如說,我們假設你運營一個博客平臺並且將你所有的數
據存儲到一個索引中。在這個索引中,你可以爲用戶數據定義一個類型,爲博客數據定義另一個類型,當然,也可
以爲評論數據定義另一個類型。
 
 
字段Field
相當於是數據表的字段,對文檔數據根據不同屬性進行的分類標識
 
映射 mapping
mapping是處理數據的方式和規則方面做一些限制,如某個字段的數據類型、默認值、分析器、是否被索引等等,
這些都是映射裏面可以設置的,其它就是處理es裏面數據的一些使用規則設置也叫做映射,按着最優規則處理數據
對性能提高很大,因此才需要建立映射,並且需要思考如何建立映射才能對性能更好。
 
文檔 document
一個文檔是一個可被索引的基礎信息單元。比如,你可以擁有某一個客戶的文檔,某一個產品的一個文檔,當然,
也可以擁有某個訂單的一個文檔。文檔以JSONJavascript Object Notation)格式來表示,而JSON是一個到處存
在的互聯網數據交互格式。
在一個index/type裏面,你可以存儲任意多的文檔。注意,儘管一個文檔,物理上存在於一個索引之中,文檔必須
被索引/賦予一個索引的typ
 
 
接近實時 NRT
Elasticsearch是一個接近實時的搜索平臺。這意味着,從索引一個文檔直到這個文檔能夠被搜索到有一個輕微的延
遲(通常是1秒以內)
 
 
集羣 cluster
Relational DB ‐> Databases ‐> Tables ‐> Rows ‐> Columns
Elasticsearch ‐> Indices ‐> Types ‐> Documents ‐> Fields一個集羣就是由一個或多個節點組織在一起,它們共同持有整個的數據,並一起提供索引和搜索功能。一個集羣由
一個唯一的名字標識,這個名字默認就是“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客戶端操作之Postman

1、ElasticSearch的接口語法

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

參數說明:

2、Postman 操作之創建索引庫index = 新增索引庫blog1

3、Postman 操作之創建索引庫index 添加映射mapping =爲bolg1索引庫添加hello 的映射

請求URL: post    http://localhost:9200/blog1/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 截圖:

4、postman 操作之刪除索引庫

請求URL: delete  http://localhost:9200/blog1

postman截圖:

5、postman 操作之創建index 索引庫和映射mapping = 創建blog2 索引庫並指定article 的相關映射

請求URL: put http://localhost:9200/blog2 

 請求體:

{
    "mappings": {
        "article": {
            "properties": {
                "id": {
                    "type": "long",
                    "store": true
                   
                },
                "title": {
                    "type": "text",
                    "store": true
                },
                "content": {
                    "type": "text",
                    "store": true
                } 
            } 
        } 
    } 
}

postman 截圖:

6、postman 操作之新增文檔

請求URL: post  http://localhost:9200/blog2/article/1 

請求體:

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

postman 截圖:

7、postman 操作之更新文檔

請求URL: post  http://localhost:9200/blog2/article/1

請求體:

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

 postman 截圖:

8、postman 操作之刪除文檔

請求URL: delete   http://localhost:9200/blog2/article/1

postman 截圖:

 

 9、postman 操作之刪除文檔

請求URL: delete http://localhost:9200/blog2/article/1

postmane 截圖:

10、postman 操作之根據文檔ID進行查詢

請求URL: get    localhost:9200/blog2/article/1

postmane 截圖:

 

11、postman 操作之根據文檔querystring進行查詢 

請求URL: post   localhost:9200/blog2/article/_search

請求體:

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

postmane 截圖:

12、postmane 操作之 根據文檔term進行查詢 

請求URL: post    localhost:9200/blog2/article/_search

請求體:

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

posmane 截圖:

第六、ElasticSearch服務端集成IK分詞

6.1 IK分詞器簡介:

      IKAnalyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。從200612月推出1.0版開始,
IKAnalyzer已經推出 了3個大版本。最初,它是以開源項目Lucene爲應用主體的,結合詞典分詞和文法分析算法的
中文分詞組件。新版本的IKAnalyzer3.0則發展爲 面向Java的公用分詞組件,獨立於Lucene項目,同時提供了對
Lucene的默認優化實現。
IK分詞器3.0的特性如下:
1)採用了特有的正向迭代最細粒度切分算法,具有60萬字/秒的高速處理能力。
2)採用了多子處理器分析模 式,支持:英文字母(IP地址、EmailURL)、數字(日期,常用中文數量詞,羅馬數字,科學計數法),中文 詞彙(姓名、地名處理)等分詞處理。
3)對中英聯合支持不是很好,在這方面的處理比較麻煩.需再做一次查詢,同時是支持個人詞條的優化的詞典存儲,更小的內存佔用。
4)支持用戶詞典擴展定義。
5)針對Lucene全文檢索優 化的查詢分析器IKQueryParser;採用歧義分析算
 
6.2 Elasticsearch 集成IK
1)下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
2)解壓,將解壓後的elasticsearch文件夾拷貝到elasticsearch-6.3.2\plugins下,並重命名文件夾爲analysis-ik
3)重新啓動ElasticSearch,即可加載IK分詞器

 

6.3 IK分詞功能測試

IK提供了兩個分詞算法ik_smart ik_max_word
其中 ik_smart 爲最少切分,ik_max_word爲最細粒度劃分
我們分別來試一下
1)最小切分:
請求體:
{
	"analyzer":"ik_smart",
	"text":"我是程序員"
}

postmane 截圖:

 

 2)最細切分:在瀏覽器地址欄輸入地址

請求URL: post  http://127.0.0.1:9200/_analyze?pretty=true

請求體:

{
	"analyzer":"ik_max_word",
	"text":"我是程序員"
}

postman 截圖:

6.4 修改索引庫的mapping 映射

1、刪除原有的blog2 索引庫

delete http://localhost:9200/blog2
2、創建blog2索引,此時分詞器使用ik_max_word
put http://localhost:9200/blog2

請求體:

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

3、創建文檔

post http://localhost:9200/blog2/article/1

請求體:

{
    "id":1,
    "title":"ElasticSearch是一個基於Lucene的搜索服務器",
    "content":"它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java 開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時 搜索,穩定,可靠,快速,安裝使用方便。" 
}
4、再次執行queryString 查詢
請求URL:post  localhost:9200/blog2/article/_search
請求體:
{ "query": { "query_string": { "default_field": "title", "query": "搜索服務器" } } }
 
postman 截圖:
 
檢索結果:

 

5、再次執行trem 測試

請求URL:post  localhost:9200/blog2/article/_search
請求體:
{ "query": { "term": { "title": "搜索" } } }
 
postman 截圖:

檢索結果:

 

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