1. 程式人生 > 實用技巧 >分散式搜尋引擎-ElasticSearch詳解

分散式搜尋引擎-ElasticSearch詳解

ElasticSearch簡介

什麼是ElasticSearch

ElaticSearch,簡稱為ES, ES是一個開源的高擴充套件的分散式全文檢索引擎,它可以近乎實時的儲存、檢索資料;本身擴充套件性很好,可以擴充套件到上百臺伺服器,處理PB級別的資料。ES也使用Java開發並使用Lucene作為其核心來實現所有索引和搜尋的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜尋變得簡單。

ElasticSearch對比Solr

①Solr利用Zookeeper進行分散式管理,而Elasticsearch自身帶有分散式協調管理功能。

②Solr支援更多格式的資料,而Elasticsearch僅支援json檔案格式。

③Solr官方提供的功能更多,而Elasticsearch本身更注重於核心功能,高階功能多有第三方外掛提供。

④Solr在傳統的搜尋應用中表現好於Elasticsearch,但在處理實時搜尋應用時效率明顯低於Elasticsearch。

ElasticSearch的安裝

Windows下安裝ElasticSearch

下載ElasticSearch安裝包

②解壓ElasticSearch安裝包,目錄結構如下圖

③修改ElasticSearch的配置檔案:./config/elasticsearch.yml,增加以下兩句命令

# 允許elasticsearch跨越訪問,如果不安裝elasticsearch-head,是可以不修改配置檔案,直接啟動。
http.cors.enabled: true http.cors.allow-origin: "*"

④啟動ElasticSearch服務:./bin/elasticsearch.bat,控制檯顯示日誌資訊如下

ElasticSearch會使用兩個埠9300和9200,9300是TCP通訊埠,叢集間和TCPClient都執行該埠,9200是HTTP協議的RESTful介面

⑤通過瀏覽器訪問ElasticSearch伺服器,看到如下返回的json資訊,代表服務啟動成功

安裝ElasticSearch的圖形化介面外掛

簡介

ElasticSearch不同於Solr自帶圖形化介面,可以通過安裝ElasticSearch的head外掛,完成圖形化介面的效果,完成索引資料的檢視。安裝外掛的方式有兩種,線上安裝和本地安裝。elasticsearch-5-*以上版本安裝elasticsearch-head需要安裝node和grunt

安裝步驟

下載elasticsearch-head-master

②解壓elasticsearch-head-master安裝包,目錄結構如下圖

下載nodejs,安裝步驟略過,安裝完成後,在DOS視窗檢視是否安裝成功,使用命令:node -v,出現如下截圖,則說明安裝成功

④安裝grunt,在node安裝路徑下,使用命令安裝:npm install -g grunt-cli安裝grunt,安裝結束後,使用命令grunt -version檢視是否安裝成功出現如下截圖,則說明安裝成功

⑤在DOS視窗進入到elasticsearch-head-master路徑下,使用命令npm install安裝pathomjs

⑥啟動服務,使用命令:npm start啟用服務,出現如下截圖,則說明服務啟動成功

⑦瀏覽器訪問:localhost:9100,出現如下截圖,則說明elasticsearch-head安裝成功,預設埠是9100

ElasticSearch相關概念

概述

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

Elasticsearch對比傳統關係型資料庫
Relational DBElasticsearch
Databases Indices
Tables Types
Rows Documents
Columns Fields

Elasticsearch核心概念

索引(index)

一個索引就是一個擁有幾分相似特徵的文件的集合。比如說,你可以有一個客戶資料的索引,另一個產品目錄的索引,還有一個訂單資料的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這個索引中的文件進行索引、搜尋、更新和刪除的時候,都要使用到這個名字。在一個叢集中,可以定義任意多的索引。

型別(type)

在一個索引中,你可以定義一種或多種型別。一個型別是你的索引的一個邏輯上的分類/分割槽,其語義完全由你來定。通常,會為具有一組共同欄位的文件定義一個型別。比如說,我們假設你運營一個部落格平臺並且將你所有的資料儲存到一個索引中。在這個索引中,你可以為使用者資料定義一個型別,為部落格資料定義另一個型別,當然,也可以為評論資料定義另一個型別。

欄位(field)

相當於是資料表的欄位,對文件資料根據不同屬性進行的分類標識。

對映(mapping)

mapping是處理資料的方式和規則方面做一些限制,如某個欄位的資料型別、預設值、分析器、是否被索引等等,這些都是對映裡面可以設定的,其它就是處理es裡面資料的一些使用規則設定也叫做對映,按著最優規則處理資料對效能提高很大,因此才需要建立對映,並且需要思考如何建立對映才能對效能更好。

文件(document)

一個文件是一個可被索引的基礎資訊單元。比如,你可以擁有某一個客戶的文件,某一個產品的一個文件,當然,也可以擁有某個訂單的一個文件。文件以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的網際網路資料互動格式。

在一個index/type裡面,你可以儲存任意多的文件。注意,儘管一個文件,物理上存在於一個索引之中,文件必須被索引/賦予一個索引的type。

接近實時(NRT)

ElasticSearch是一個接近實時的搜尋平臺。這意味著,從索引一個文件直到這個文件能夠被搜尋到有一個輕微的延遲(通常是1秒以內)。

叢集(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服務的客戶端。

第一種:使用elasticsearch-head外掛。

第二種:使用ElasticSearch提供的Restful介面直接訪問。

第三種:使用ElasticSearch提供的API進行訪問。

Postman概述

Postman是款強大網頁除錯工具的windows客戶端,提供功能強大的Web API & HTTP 請求除錯。軟體功能非常強大,介面簡潔明晰、操作方便快捷,設計得很人性化。Postman中文版能夠傳送任何型別的HTTP請求 (GET、HEAD、POST、PUT等),且可以附帶任何數量的引數。

Postman安裝步驟

下載Postman

②雙擊安裝即可

使用Postman進行Restful訪問(DSL語句)

ElasticSearch的介面語法

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
選項詳解
引數說明
VERB 適當的HTTP方法或謂詞:GET、POST、PUT、HEAD 或者DELETE
PROTOCOL http或者https(如果你在ElasticSearch前面有一個https代理)
HOST ElasticSearch叢集中任意節點的主機名,或者用localhost代表本地機器上的節點
PORT 執行ElasticSearch的HTTP服務的埠號,預設是 9200
PATH API的終端路徑(例如_count將返回叢集中文件數量)。Path可能包含多個元件,例如:_cluster/stats 和_nodes/stats/jvm
QUERY_STRING 任意可選的查詢字串引數(例如pretty將格式化地輸出JSON返回值,使其更容易閱讀)
BODY 一個JSON格式的請求體 (如果請求需要的話)

建立索引庫時對映

請求url

PUT    localhost:9200/blog

請求體

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

執行成功返回的資料

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "blog"
}

建立索引庫

請求url

PUT    localhost:9200/blog1

請求體:無

執行成功返回的資料

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "blog1"
}

設定對映

請求url

POST    http://localhost:9200/blog1/hello/_mappings

請求體

{
    "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"
            }
        }
    }
}

執行成功返回的資料

{
    "acknowledged": true
}

刪除索引庫

請求url

DELETE    http://localhost:9200/blog1

請求引數:無

執行成功返回的資料

{
    "acknowledged": true
}

向索引庫中新增文件

請求url

POST    http://localhost:9200/blog/article/1

請求引數

{
    "id": 1,
    "title": "ElasticSearch是一個基於Lucene的搜尋伺服器",
    "content": "它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,是當前流行的企業級搜尋引擎。設計用於雲端計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。"
}

執行成功返回的資料

{
    "_index": "blog",
    "_type": "article",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": true
}

修改文件

請求url

POST    http://localhost:9200/blog/article/1

請求引數

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

執行成功返回的資料

{
    "_index": "blog",
    "_type": "article",
    "_id": "1",
    "_version": 2,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": false
}

刪除文件

請求url

DELETE    http://localhost:9200/blog/article/1

請求引數:無

執行成功返回的資料

{
    "found": true,
    "_index": "blog",
    "_type": "article",
    "_id": "1",
    "_version": 3,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    }
}

查詢文件

準備資料

①建立商品索引庫與對映

# 請求url
PUT    http://localhost:9200/goods

# 請求引數
{
    "mappings": {
        "mobile_phone": {
            "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"
                }
            }
        }
    }
}


# 執行成功返回的資料
{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "goods"
}

②向商品索引庫內新增文件

# 新增文件1
# 請求url
POST    http://localhost:9200/goods/mobile_phone/1

# 請求引數
{
    "id": 1,
    "title": "小米8",
    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
}

# 執行成功返回的資料
{
    "_index": "goods",
    "_type": "mobile_phone",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": true
}


# 新增文件2
# 請求url
POST    http://localhost:9200/goods/mobile_phone/2

# 請求引數
{
    "id": 2,
    "title": "小米10",
    "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
}

# 執行成功返回的資料
{
    "_index": "goods",
    "_type": "mobile_phone",
    "_id": "2",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": true
}


# 新增文件3
# 請求url
POST    http://localhost:9200/goods/mobile_phone/3

# 請求引數
{
    "id": 3,
    "title": "紅米k30",
    "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
}

# 執行成功返回的資料
{
    "_index": "goods",
    "_type": "mobile_phone",
    "_id": "3",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": true
}


# 新增文件4
# 請求url
POST    http://localhost:9200/goods/mobile_phone/4

# 請求引數
{
    "id": 4,
    "title": "華為p30",
    "content": "麒麟980AI智慧晶片,感光徠卡三攝,全面屏屏內指紋版,天空之境,8GB+128GB,全網通。"
}

# 執行成功返回的資料
{
    "_index": "goods",
    "_type": "mobile_phone",
    "_id": "4",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": true
}


# 新增文件5
# 請求url
POST    http://localhost:9200/goods/mobile_phone/5

# 請求引數
{
    "id": 5,
    "title": "華為筆記本",
    "content": "膝上型電腦MateBook 14,2020款銳龍版,14英寸,R5,4600H,16G+512G,2K觸控全面屏,多屏協同,輕薄本,深空灰。"
}

# 執行成功返回的資料
{
    "_index": "goods",
    "_type": "mobile_phone",
    "_id": "5",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": true
}

方式一:根據ID查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/1

請求引數:無

執行成功返回的資料

{
    "_index": "goods",
    "_type": "mobile_phone",
    "_id": "1",
    "_version": 1,
    "found": true,
    "_source": {
        "id": 1,
        "title": "小米8",
        "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
    }
}

方式二:querystring查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "query":{
        "query_string":{
            "default_field":"title",
            "query":"小米"
        }
    }
}

執行成功返回的資料

{
    "took": 15,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": 1.219939,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "2",
                "_score": 1.219939,
                "_source": {
                    "id": 2,
                    "title": "小米10",
                    "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "1",
                "_score": 0.5063205,
                "_source": {
                    "id": 1,
                    "title": "小米8",
                    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "3",
                "_score": 0.25316024,
                "_source": {
                    "id": 3,
                    "title": "紅米k30",
                    "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
                }
            }
        ]
    }
}

方式三:trem查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "query": {
        "term": {
            "title": ""
        }
    }
}

執行成功返回的資料

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": 0.6099695,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "2",
                "_score": 0.6099695,
                "_source": {
                    "id": 2,
                    "title": "小米10",
                    "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "1",
                "_score": 0.25316024,
                "_source": {
                    "id": 1,
                    "title": "小米8",
                    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "3",
                "_score": 0.25316024,
                "_source": {
                    "id": 3,
                    "title": "紅米k30",
                    "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
                }
            }
        ]
    }
}

方式四:fuzzy查詢(模糊查詢)

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "query": {
        "fuzzy": {
            "title": ""
        }
    }
}

執行成功返回的資料

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": 0.6099695,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "2",
                "_score": 0.6099695,
                "_source": {
                    "id": 2,
                    "title": "小米10",
                    "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "1",
                "_score": 0.25316024,
                "_source": {
                    "id": 1,
                    "title": "小米8",
                    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "3",
                "_score": 0.25316024,
                "_source": {
                    "id": 3,
                    "title": "紅米k30",
                    "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
                }
            }
        ]
    }
}

過濾後查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "query":{
        "bool":{
            "filter":{
                "term":{
                    "title":"8"
                }
            },
            "must":[
                {
                    "match":{
                        "title":""
                    }
                }
            ]
        }
    }
}

執行成功返回的資料

{
    "took": 12,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.25316024,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "1",
                "_score": 0.25316024,
                "_source": {
                    "id": 1,
                    "title": "小米8",
                    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
                }
            }
        ]
    }
}

查詢後過濾

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "query":{
        "match":{
            "title":""
        }
    },
    "post_filter":{
        "term":{
            "title":"8"
        }
    }
}

執行成功返回的資料

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.25316024,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "1",
                "_score": 0.25316024,
                "_source": {
                    "id": 1,
                    "title": "小米8",
                    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
                }
            }
        ]
    }
}

分頁查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "query": {
        "match_all": {}
    },
    "from": 1,
    "size": 1
}

執行成功返回的資料

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 5,
        "max_score": 1.0,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "id": 2,
                    "title": "小米10",
                    "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
                }
            }
        ]
    }
}

投影查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "query": {
        "match_all": {}
    },
    "_source": [
        "title",
        "content"
    ]
}

執行成功返回的資料

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 5,
        "max_score": 1.0,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "5",
                "_score": 1.0,
                "_source": {
                    "title": "華為筆記本",
                    "content": "膝上型電腦MateBook 14,2020款銳龍版,14英寸,R5,4600H,16G+512G,2K觸控全面屏,多屏協同,輕薄本,深空灰。"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "title": "小米10",
                    "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "4",
                "_score": 1.0,
                "_source": {
                    "title": "華為p30",
                    "content": "麒麟980AI智慧晶片,感光徠卡三攝,全面屏屏內指紋版,天空之境,8GB+128GB,全網通。"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "title": "小米8",
                    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "3",
                "_score": 1.0,
                "_source": {
                    "title": "紅米k30",
                    "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
                }
            }
        ]
    }
}

多值查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/_mget

請求引數

{
  "ids": [2,1,3]
}

執行成功返回的資料

{
    "docs": [
        {
            "_index": "goods",
            "_type": "mobile_phone",
            "_id": "2",
            "_version": 1,
            "found": true,
            "_source": {
                "id": 2,
                "title": "小米10",
                "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
            }
        },
        {
            "_index": "goods",
            "_type": "mobile_phone",
            "_id": "1",
            "_version": 1,
            "found": true,
            "_source": {
                "id": 1,
                "title": "小米8",
                "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
            }
        },
        {
            "_index": "goods",
            "_type": "mobile_phone",
            "_id": "3",
            "_version": 1,
            "found": true,
            "_source": {
                "id": 3,
                "title": "紅米k30",
                "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
            }
        }
    ]
}

高亮查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "query": {
        "match": {
            "title": "蝦米"
        }
    },
    "highlight": {
        "fields": {
            "title": {}
        },
        "pre_tags": [
            "<span style='color:red'>"
        ],
        "post_tags": [
            "</span>"
        ]
    }
}

執行成功返回的資料

{
    "took": 35,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": 0.6099695,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "2",
                "_score": 0.6099695,
                "_source": {
                    "id": 2,
                    "title": "小米10",
                    "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
                },
                "highlight": {
                    "title": [
                        "小<span style='color:red'>米</span>10"
                    ]
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "1",
                "_score": 0.25316024,
                "_source": {
                    "id": 1,
                    "title": "小米8",
                    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
                },
                "highlight": {
                    "title": [
                        "小<span style='color:red'>米</span>8"
                    ]
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "3",
                "_score": 0.25316024,
                "_source": {
                    "id": 3,
                    "title": "紅米k30",
                    "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
                },
                "highlight": {
                    "title": [
                        "紅<span style='color:red'>米</span>k30"
                    ]
                }
            }
        ]
    }
}

聚合查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "aggs": {
        "MyOwnGroupBy": {
            "terms": {
                "field": "title.keyword",
                "size": 10
            }
        }
    }
}

執行成功返回的資料

{
    "took": 16,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 5,
        "max_score": 1.0,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "5",
                "_score": 1.0,
                "_source": {
                    "id": 5,
                    "title": "華為筆記本",
                    "content": "膝上型電腦MateBook 14,2020款銳龍版,14英寸,R5,4600H,16G+512G,2K觸控全面屏,多屏協同,輕薄本,深空灰。"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "id": 2,
                    "title": "小米10",
                    "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "4",
                "_score": 1.0,
                "_source": {
                    "id": 4,
                    "title": "華為p30",
                    "content": "麒麟980AI智慧晶片,感光徠卡三攝,全面屏屏內指紋版,天空之境,8GB+128GB,全網通。"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "id": 1,
                    "title": "小米8",
                    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
                }
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "3",
                "_score": 1.0,
                "_source": {
                    "id": 3,
                    "title": "紅米k30",
                    "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
                }
            }
        ]
    },
    "aggregations": {
        "MyOwnGroupBy": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
        }
    }
}

區間查詢

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "query": {
        "bool": {
            "filter": {
                "range": {
                    "id": {
                        "gt": 2,
                        "lt": 4
                    }
                }
            }
        }
    }
}

執行成功返回的資料

{
    "took": 12,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.0,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "3",
                "_score": 0.0,
                "_source": {
                    "id": 3,
                    "title": "紅米k30",
                    "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
                }
            }
        ]
    }
}

排序

請求url

GET    http://localhost:9200/goods/mobile_phone/_search

請求引數

{
    "sort": [
        {
            "id": {
                "order": "desc"
            }
        }
    ]
}

執行成功返回的資料

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 5,
        "max_score": null,
        "hits": [
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "5",
                "_score": null,
                "_source": {
                    "id": 5,
                    "title": "華為筆記本",
                    "content": "膝上型電腦MateBook 14,2020款銳龍版,14英寸,R5,4600H,16G+512G,2K觸控全面屏,多屏協同,輕薄本,深空灰。"
                },
                "sort": [
                    5
                ]
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "4",
                "_score": null,
                "_source": {
                    "id": 4,
                    "title": "華為p30",
                    "content": "麒麟980AI智慧晶片,感光徠卡三攝,全面屏屏內指紋版,天空之境,8GB+128GB,全網通。"
                },
                "sort": [
                    4
                ]
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "3",
                "_score": null,
                "_source": {
                    "id": 3,
                    "title": "紅米k30",
                    "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬後置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,遊戲智慧手機"
                },
                "sort": [
                    3
                ]
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "2",
                "_score": null,
                "_source": {
                    "id": 2,
                    "title": "小米10",
                    "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點選直達】"
                },
                "sort": [
                    2
                ]
            },
            {
                "_index": "goods",
                "_type": "mobile_phone",
                "_id": "1",
                "_score": null,
                "_source": {
                    "id": 1,
                    "title": "小米8",
                    "content": "【螢幕指紋版/後指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299。"
                },
                "sort": [
                    1
                ]
            }
        ]
    }
}

中文分詞器

標準分詞器效果測試

請求url

GET    http://localhost: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
        }
    ]
}

經過測試發現,標準分詞器分詞結果並不是我們想要的效果,我們想要的效果是:我、是、程式、程式設計師。

這樣的話就需要對中文支援良好的分析器的支援,支援中文分詞的分詞器有很多,比如:IK分詞器、word分詞器、庖丁解牛、盤古分詞、Ansj分詞等,但我們常用的是IK分詞器。

IK分詞器簡介

IKAnalyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始,IKAnalyzer已經推出 了3個大版本。最初,它是以開源專案Lucene為應用主體的,結合詞典分詞和文法分析演算法的中文分片語件。新版本的IKAnalyzer3.0則發展為 面向Java的公用分片語件,獨立於Lucene專案,同時提供了對Lucene的預設優化實現。

IK分詞器3.0的特性如下:

①採用了特有的“正向迭代最細粒度切分演算法“,具有60萬字/秒的高速處理能力。

②採用了多子處理器分析模式,支援:英文字母(IP地址、Email、URL)、數字(日期,常用中文數量詞,羅馬數字,科學計數法),中文詞彙(姓名、地名處理)等分詞處理。

③對中英聯合支援不是很好,在這方面的處理比較麻煩.需再做一次查詢,同時是支援個人詞條的優化的詞典儲存,更小的記憶體佔用。

④支援使用者詞典擴充套件定義。

⑤針對Lucene全文檢索優化的查詢分析器IKQueryParser;採用歧義分析演算法優化查詢關鍵字的搜尋排列組合,能極大的提高Lucene檢索的命中率。

ElasticSearch整合IK分詞器的步驟

①訪問:http://localhost:9200,檢視ElasticSearch版本

下載IK分詞器,對應版本

③解壓,將解壓後的資料夾拷貝到./plugins下,並重命名資料夾為analysis-ik,目錄結構如下圖

④重新啟動ElasticSearch,即可載入IK分詞器

IK分詞器效果測試

IK提供了兩個分詞演算法ik_smart和ik_max_word,其中 ik_smart為最少切分,ik_max_word為最細粒度切分。

最少切分ik_smart

請求url

GET    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
        }
    ]
}

最細力度切分ik_max_word

請求urlGET 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
        }
    ]
}

ElasticSearch叢集

簡介

ES叢集是一個 P2P型別(使用gossip協議)的分散式系統,除了叢集狀態管理以外,其他所有的請求都可以傳送到叢集內任意一臺節點上,這個節點可以自己找到需要轉發給哪些節點,並且直接跟這些節點通訊。所以,從網路架構及服務配置上來說,構建叢集所需要的配置極其簡單。在ElasticSearch 2.0 之前,無阻礙的網路下,所有配置了相同cluster.name的節點都自動歸屬到一個叢集中。2.0 版本之後,基於安全的考慮避免開發環境過於隨便造成的麻煩,從 2.0 版本開始,預設的自動發現方式改為了單播(unicast)方式。配置裡提供幾臺節點的地址,ElasticSearch將其視作gossip router角色,藉以完成叢集的發現。由於這只是ElasticSearch內一個很小的功能,所以gossip router角色並不需要單獨配置,每個ElasticSearch節點都可以擔任。所以,採用單播方式的叢集,各節點都配置相同的幾個節點列表作為router即可。

叢集中節點數量沒有限制,一般大於等於2個節點就可以看做是叢集了。一般處於高效能及高可用方面來考慮一般叢集中的節點數量都是3個及3個以上。

叢集的搭建

①準備三臺ElasticSearch伺服器:建立elasticsearch-cluster資料夾,在內部複製三個elasticsearch服務

②修改每臺伺服器配置:修改elasticsearch-cluster\node*\config\elasticsearch.yml配置檔案

#節點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"]


#節點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"]


#節點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

叢集測試

①新增索引和對映

請求url

PUT    http://127.0.0.1:9200/test

請求引數

{
    "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"
                }
            }
        }
    }
}

②新增文件

請求url

POST    http://localhost:9200/test/article/1

請求引數

{
    "id": 1,
    "title": "ElasticSearch是一個基於Lucene的搜尋伺服器",
    "content": "它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,是當前流行的企業級搜尋引擎。設計用於雲端計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。"
}

③使用elasticsearch-head檢視叢集情況