一 .簡(jiǎn)介
(1) 一切設(shè)計(jì)都是為了提高搜索的性能
(2)?是一個(gè)基于Lucene構(gòu)建的開(kāi)源、分布式、RESTful的全文本搜索引擎
(3)?分布式實(shí)時(shí)文件存儲(chǔ),并將每一個(gè)字段都編入索引,使其可以被搜索
(4)?可以擴(kuò)展到上百臺(tái)服務(wù)器,達(dá)到擴(kuò)容效果,添加更多節(jié)點(diǎn);處理PB級(jí)別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)
(5) 面向文檔型數(shù)據(jù)庫(kù),一條數(shù)據(jù)在這里就是一個(gè)文檔,用JSON作為文檔序列化的格式

二 .概念
1.索引(index)
一個(gè)?索引?類似于傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)中的一個(gè)?數(shù)據(jù)庫(kù)?,是一個(gè)存儲(chǔ)關(guān)系型文檔的地方,并通過(guò)引用此名稱完成文檔的創(chuàng)建、搜索、更新及刪除操作
2.類型(type)
類型是索引內(nèi)部的邏輯分區(qū)(category/partition),然而其意義完全取決于用戶需求;一般來(lái)說(shuō),類型就是為那些擁有相同的域的文檔做的預(yù)定義
3.文檔(document)
文檔是Lucene索引和搜索的原子單位,它是包含了一個(gè)或多個(gè)域的容器,基于JSON格式進(jìn)行表示;文檔由一個(gè)或多個(gè)域組成,每個(gè)域擁有一個(gè)名字及一個(gè)或多個(gè)值,有多個(gè)值的域通常稱為“多值域”,文檔中,域的數(shù)據(jù)存儲(chǔ)時(shí)支持“string”、“numbers”、“Booleans”和“dates”幾種類型,不同類型的數(shù)據(jù)在索引時(shí)是略有區(qū)別的。在 Elasticsearch 中文檔是?不可改變?的,不能修改它們。
4.映射(mapping)
所有的文檔在存儲(chǔ)之前都要首先進(jìn)行分析。用戶可根據(jù)需要定義如何將文本分割成token、哪些token應(yīng)該被過(guò)濾掉,以及哪些文本需要進(jìn)行額外處理等等;ES還提供了額外功能,例如將域中的內(nèi)容按需排序
5.集群(cluster)
ES集群是一個(gè)或多個(gè)節(jié)點(diǎn)的集合,它們共同存儲(chǔ)了整個(gè)數(shù)據(jù)集,并提供了聯(lián)合索引以及可跨所有節(jié)點(diǎn)的搜索能力,多節(jié)點(diǎn)組成的集群擁有冗余能力,它可以在一個(gè)或幾個(gè)節(jié)點(diǎn)出現(xiàn)故障時(shí)保證服務(wù)的整體可用性集群靠其獨(dú)有的名稱進(jìn)行標(biāo)識(shí),默認(rèn)名稱為“elasticsearch”。節(jié)點(diǎn)靠其集群名稱來(lái)決定加入哪個(gè)ES集群,一個(gè)節(jié)點(diǎn)只能屬一個(gè)集群
6.節(jié)點(diǎn)(node)
運(yùn)行了單個(gè)實(shí)例的ES主機(jī)稱為節(jié)點(diǎn),它是集群的一個(gè)成員,可以存儲(chǔ)數(shù)據(jù)、參與集群索引及搜索,操作節(jié)點(diǎn)通過(guò)為其配置的ES集群名稱確定其所要加入的集群,用戶可以按需要自定義任何希望使用的名稱,但出于管理的目的,此名稱應(yīng)該盡可能有較好的識(shí)別性可以將請(qǐng)求發(fā)送到集群中的任何節(jié)點(diǎn),包括主節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)都知道任意文檔所處的位置,并且能夠?qū)⒄?qǐng)求直接轉(zhuǎn)發(fā)到存儲(chǔ)我們所需文檔的節(jié)點(diǎn)
7.分片(shared)和副本(replica)
ES的“分片(shard)”機(jī)制可將一個(gè)索引內(nèi)部的數(shù)據(jù)分布地存儲(chǔ)于多個(gè)節(jié)點(diǎn),它通過(guò)將一個(gè)索引切分為多個(gè)底層物理的Lucene索引完成索引數(shù)據(jù)的分割存儲(chǔ)功能,這每一個(gè)物理的Lucene索引稱為一個(gè)分片(shard)。每個(gè)分片其內(nèi)部都是一個(gè)全功能且獨(dú)立的索引,創(chuàng)建索引時(shí),用戶可指定其分片的數(shù)量,默認(rèn)數(shù)量為5個(gè)
Shard有兩種類型:primary和replica,即主shard及副本shard。
Primary shard用于文檔存儲(chǔ),每個(gè)新的索引會(huì)自動(dòng)創(chuàng)建5個(gè)Primary shard,當(dāng)然此數(shù)量可在索引創(chuàng)建之前通過(guò)配置自行定義,不過(guò),一旦創(chuàng)建完成,其Primary shard的數(shù)量將不可更改。
Replica shard是Primary Shard的副本,用于冗余數(shù)據(jù)及提高搜索性能。
每個(gè)Primary shard默認(rèn)配置了一個(gè)Replica shard,但也可以配置多個(gè),且其數(shù)量可動(dòng)態(tài)更改。ES會(huì)根據(jù)需要自動(dòng)增加或減少這些Replica shard的數(shù)量。ES集群可由多個(gè)節(jié)點(diǎn)組成,各Shard分布式地存儲(chǔ)于這些節(jié)點(diǎn)上。ES可自動(dòng)在節(jié)點(diǎn)間按需要移動(dòng)shard,例如增加節(jié)點(diǎn)或節(jié)點(diǎn)故障時(shí)。簡(jiǎn)而言之,分片實(shí)現(xiàn)了集群的分布式存儲(chǔ),而副本實(shí)現(xiàn)了其分布式處理及冗余功能
三 . 數(shù)據(jù)查詢
Query API是ElasticSearch的API中較大的一部分,基于Query DSL(JSON based language for building complex queries),可完成諸多類型查詢操作,
查詢執(zhí)行過(guò)程通常要分成兩個(gè)階段,分散階段及合并階段;分散階段是向所查詢的索引中的所有shard發(fā)起執(zhí)行查詢的過(guò)程,合并階段是將各shard返回的結(jié)果合并、排序并響應(yīng)給客戶端的過(guò)程
向ElasticSearch發(fā)起查詢操作有兩種方式:一是通過(guò)RESTful request API傳遞查詢參數(shù),也稱“query-string”;另一個(gè)是通過(guò)發(fā)送REST request body,也稱作JSON格式
向ElasticSearch發(fā)起查詢操作有兩種方式:一是通過(guò)RESTful request API傳遞查詢參數(shù),也稱“query-string”;另一個(gè)是通過(guò)發(fā)送REST request body,也稱作JSON格式。


(1) 空搜索?GET /_search

hits:返回結(jié)果中最重要的部分,在?hits?數(shù)組中每個(gè)結(jié)果包含文檔的?_index?、?_type?、?_id?,加上?_source?字段
took:執(zhí)行整個(gè)搜索請(qǐng)求耗費(fèi)了多少毫秒
shards:?查詢中參與分片的總數(shù),已經(jīng)這些分片成功了多少失敗了多少
(2) 多索引,多類型
/_search? ? ? ? ? ? ?在所有的索引中搜索所有的類型
/gb/_search? ? ? ? 在?gb?索引中搜索所有的類型
/gb,us/_search? ?在?gb?和?us?索引中搜索所有的文檔
/g*,u*/_search? ? ? 在任何以?g?或者?u?開(kāi)頭的索引中搜索所有的類型
/gb/user/_search? ?在?gb?索引中搜索?user?類型
/gb,us/user,tweet/_search? ?在?gb?和?us?索引中搜索?user?和?tweet?類型
/_all/user,tweet/_search? 在所有的索引中搜索?user?和?tweet?類型
(3) .查詢表達(dá)式


match_all:查詢簡(jiǎn)單的,匹配所有文檔,在沒(méi)有指定查詢方式時(shí),它是默認(rèn)的查詢
match:全文搜索+精確查詢,在執(zhí)行查詢前,它將用正確的分析器去分析查詢字符串
multi_match :在多個(gè)字段上執(zhí)行相同的match語(yǔ)句

range:查詢找出落在指定區(qū)間的數(shù)字或時(shí)間
term:精確值匹配,查詢對(duì)于輸入的文本不分析,所以它將給定的值進(jìn)行精確查詢
terms:?查詢和term一樣,允許多值進(jìn)行匹配

exists:指定字段的值是否存在
missing :指定字段的值是否沒(méi)有
(4) .合并查詢語(yǔ)句

bool : 將多查詢組合在一起
must: 文檔?必須?匹配這些條件才能被包含進(jìn)來(lái)。
must_not:文檔必須不匹配這些條件才可以被包含進(jìn)來(lái)
Should:?如果滿足這些語(yǔ)句中的任意語(yǔ)句,將增加?_score?,否則,無(wú)任何影響。它們主要用于修正每個(gè)文檔的相關(guān)性得分
filter:?必須匹配,但它以不評(píng)分、過(guò)濾模式來(lái)進(jìn)行。這些語(yǔ)句對(duì)評(píng)分沒(méi)有貢獻(xiàn),只是根據(jù)過(guò)濾標(biāo)準(zhǔn)來(lái)排除或包含文檔
在實(shí)際開(kāi)發(fā)過(guò)程中,會(huì)根據(jù)不同的業(yè)務(wù),會(huì)出現(xiàn)各種不同程度的查詢語(yǔ)句和組合語(yǔ)句
四.倒排索引
倒排索引是搜索引擎的核心,主要作用快速搜索;在搜索引擎中,每個(gè)文檔都有一個(gè)對(duì)應(yīng)的文檔ID,文檔內(nèi)容被表示為一系列關(guān)鍵詞的集合
