一 .簡介
(1) 一切設(shè)計(jì)都是為了提高搜索的性能
(2)?是一個基于Lucene構(gòu)建的開源熟妓、分布式、RESTful的全文本搜索引擎
(3)?分布式實(shí)時(shí)文件存儲搔涝,并將每一個字段都編入索引,使其可以被搜索
(4)?可以擴(kuò)展到上百臺服務(wù)器,達(dá)到擴(kuò)容效果跃惫,添加更多節(jié)點(diǎn);處理PB級別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)
(5) 面向文檔型數(shù)據(jù)庫,一條數(shù)據(jù)在這里就是一個文檔艾栋,用JSON作為文檔序列化的格式
二 .概念
1.索引(index)
一個?索引?類似于傳統(tǒng)關(guān)系數(shù)據(jù)庫中的一個?數(shù)據(jù)庫?爆存,是一個存儲關(guān)系型文檔的地方,并通過引用此名稱完成文檔的創(chuàng)建、搜索蝗砾、更新及刪除操作
2.類型(type)
類型是索引內(nèi)部的邏輯分區(qū)(category/partition)先较,然而其意義完全取決于用戶需求;一般來說,類型就是為那些擁有相同的域的文檔做的預(yù)定義
3.文檔(document)
文檔是Lucene索引和搜索的原子單位遥诉,它是包含了一個或多個域的容器拇泣,基于JSON格式進(jìn)行表示;文檔由一個或多個域組成,每個域擁有一個名字及一個或多個值矮锈,有多個值的域通常稱為“多值域”,文檔中霉翔,域的數(shù)據(jù)存儲時(shí)支持“string”、“numbers”苞笨、“Booleans”和“dates”幾種類型债朵,不同類型的數(shù)據(jù)在索引時(shí)是略有區(qū)別的。在 Elasticsearch 中文檔是?不可改變?的瀑凝,不能修改它們序芦。
4.映射(mapping)
所有的文檔在存儲之前都要首先進(jìn)行分析。用戶可根據(jù)需要定義如何將文本分割成token粤咪、哪些token應(yīng)該被過濾掉谚中,以及哪些文本需要進(jìn)行額外處理等等;ES還提供了額外功能,例如將域中的內(nèi)容按需排序
5.集群(cluster)
ES集群是一個或多個節(jié)點(diǎn)的集合,它們共同存儲了整個數(shù)據(jù)集宪塔,并提供了聯(lián)合索引以及可跨所有節(jié)點(diǎn)的搜索能力磁奖,多節(jié)點(diǎn)組成的集群擁有冗余能力,它可以在一個或幾個節(jié)點(diǎn)出現(xiàn)故障時(shí)保證服務(wù)的整體可用性集群靠其獨(dú)有的名稱進(jìn)行標(biāo)識某筐,默認(rèn)名稱為“elasticsearch”比搭。節(jié)點(diǎn)靠其集群名稱來決定加入哪個ES集群,一個節(jié)點(diǎn)只能屬一個集群
6.節(jié)點(diǎn)(node)
運(yùn)行了單個實(shí)例的ES主機(jī)稱為節(jié)點(diǎn)南誊,它是集群的一個成員身诺,可以存儲數(shù)據(jù)、參與集群索引及搜索抄囚,操作節(jié)點(diǎn)通過為其配置的ES集群名稱確定其所要加入的集群霉赡,用戶可以按需要自定義任何希望使用的名稱,但出于管理的目的幔托,此名稱應(yīng)該盡可能有較好的識別性可以將請求發(fā)送到集群中的任何節(jié)點(diǎn),包括主節(jié)點(diǎn)同廉。每個節(jié)點(diǎn)都知道任意文檔所處的位置,并且能夠?qū)⒄埱笾苯愚D(zhuǎn)發(fā)到存儲我們所需文檔的節(jié)點(diǎn)
7.分片(shared)和副本(replica)
ES的“分片(shard)”機(jī)制可將一個索引內(nèi)部的數(shù)據(jù)分布地存儲于多個節(jié)點(diǎn)柑司,它通過將一個索引切分為多個底層物理的Lucene索引完成索引數(shù)據(jù)的分割存儲功能迫肖,這每一個物理的Lucene索引稱為一個分片(shard)。每個分片其內(nèi)部都是一個全功能且獨(dú)立的索引,創(chuàng)建索引時(shí)攒驰,用戶可指定其分片的數(shù)量蟆湖,默認(rèn)數(shù)量為5個
Shard有兩種類型:primary和replica,即主shard及副本shard玻粪。
Primary shard用于文檔存儲隅津,每個新的索引會自動創(chuàng)建5個Primary shard,當(dāng)然此數(shù)量可在索引創(chuàng)建之前通過配置自行定義劲室,不過伦仍,一旦創(chuàng)建完成,其Primary shard的數(shù)量將不可更改很洋。
Replica shard是Primary Shard的副本充蓝,用于冗余數(shù)據(jù)及提高搜索性能。
每個Primary shard默認(rèn)配置了一個Replica shard喉磁,但也可以配置多個谓苟,且其數(shù)量可動態(tài)更改。ES會根據(jù)需要自動增加或減少這些Replica shard的數(shù)量协怒。ES集群可由多個節(jié)點(diǎn)組成涝焙,各Shard分布式地存儲于這些節(jié)點(diǎn)上。ES可自動在節(jié)點(diǎn)間按需要移動shard孕暇,例如增加節(jié)點(diǎn)或節(jié)點(diǎn)故障時(shí)仑撞。簡而言之赤兴,分片實(shí)現(xiàn)了集群的分布式存儲,而副本實(shí)現(xiàn)了其分布式處理及冗余功能
三 . 數(shù)據(jù)查詢
Query API是ElasticSearch的API中較大的一部分隧哮,基于Query DSL(JSON based language for building complex queries)搀缠,可完成諸多類型查詢操作,
查詢執(zhí)行過程通常要分成兩個階段近迁,分散階段及合并階段;分散階段是向所查詢的索引中的所有shard發(fā)起執(zhí)行查詢的過程,合并階段是將各shard返回的結(jié)果合并簸州、排序并響應(yīng)給客戶端的過程
向ElasticSearch發(fā)起查詢操作有兩種方式:一是通過RESTful request API傳遞查詢參數(shù)鉴竭,也稱“query-string”;另一個是通過發(fā)送REST request body岸浑,也稱作JSON格式
向ElasticSearch發(fā)起查詢操作有兩種方式:一是通過RESTful request API傳遞查詢參數(shù)搏存,也稱“query-string”;另一個是通過發(fā)送REST request body矢洲,也稱作JSON格式璧眠。
(1) 空搜索?GET /_search
hits:返回結(jié)果中最重要的部分,在?hits?數(shù)組中每個結(jié)果包含文檔的?_index?读虏、?_type?责静、?_id?,加上?_source?字段
took:執(zhí)行整個搜索請求耗費(fèi)了多少毫秒
shards:?查詢中參與分片的總數(shù)盖桥,已經(jīng)這些分片成功了多少失敗了多少
(2) 多索引灾螃,多類型
/_search? ? ? ? ? ? ?在所有的索引中搜索所有的類型
/gb/_search? ? ? ? 在?gb?索引中搜索所有的類型
/gb,us/_search? ?在?gb?和?us?索引中搜索所有的文檔
/g*,u*/_search? ? ? 在任何以?g?或者?u?開頭的索引中搜索所有的類型
/gb/user/_search? ?在?gb?索引中搜索?user?類型
/gb,us/user,tweet/_search? ?在?gb?和?us?索引中搜索?user?和?tweet?類型
/_all/user,tweet/_search? 在所有的索引中搜索?user?和?tweet?類型
(3) .查詢表達(dá)式
match_all:查詢簡單的,匹配所有文檔揩徊,在沒有指定查詢方式時(shí)腰鬼,它是默認(rèn)的查詢
match:全文搜索+精確查詢,在執(zhí)行查詢前塑荒,它將用正確的分析器去分析查詢字符串
multi_match :在多個字段上執(zhí)行相同的match語句
range:查詢找出落在指定區(qū)間的數(shù)字或時(shí)間
term:精確值匹配熄赡,查詢對于輸入的文本不分析,所以它將給定的值進(jìn)行精確查詢
terms:?查詢和term一樣齿税,允許多值進(jìn)行匹配
exists:指定字段的值是否存在
missing :指定字段的值是否沒有
(4) .合并查詢語句
bool : 將多查詢組合在一起
must: 文檔?必須?匹配這些條件才能被包含進(jìn)來彼硫。
must_not:文檔必須不匹配這些條件才可以被包含進(jìn)來
Should:?如果滿足這些語句中的任意語句,將增加?_score?凌箕,否則乌助,無任何影響。它們主要用于修正每個文檔的相關(guān)性得分
filter:?必須匹配陌知,但它以不評分他托、過濾模式來進(jìn)行。這些語句對評分沒有貢獻(xiàn)仆葡,只是根據(jù)過濾標(biāo)準(zhǔn)來排除或包含文檔
在實(shí)際開發(fā)過程中赏参,會根據(jù)不同的業(yè)務(wù)志笼,會出現(xiàn)各種不同程度的查詢語句和組合語句
四.倒排索引
倒排索引是搜索引擎的核心,主要作用快速搜索把篓;在搜索引擎中纫溃,每個文檔都有一個對應(yīng)的文檔ID,文檔內(nèi)容被表示為一系列關(guān)鍵詞的集合