ES學(xué)習(xí)筆記1

學(xué)習(xí)文檔地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.html

基礎(chǔ)入門/你知道的,為了搜索.../索引員工文檔

一個(gè) Elasticsearch 集群可以包含多個(gè)索引 ,每個(gè)索引可以包含多個(gè)類型 。這些不同的類型存儲(chǔ)著多個(gè)文檔 ,每個(gè)文檔又有多個(gè)屬性 。

索引在不同語(yǔ)境下的含義:
索引(名詞):
一個(gè)索引類似于傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)中的一個(gè)數(shù)據(jù)庫(kù) ,是一個(gè)存儲(chǔ)關(guān)系型文檔的地方。 索引 (index) 的復(fù)數(shù)詞為 indices 或 indexes 。
索引(動(dòng)詞):
索引一個(gè)文檔就是存儲(chǔ)一個(gè)文檔到一個(gè)索引(名詞)中以便被檢索和查詢。這非常類似于 SQL 語(yǔ)句中的 INSERT 關(guān)鍵詞,除了文檔已存在時(shí),新文檔會(huì)替換舊文檔情況之外。
倒排索引:
關(guān)系型數(shù)據(jù)庫(kù)通過(guò)增加一個(gè)索引比如一個(gè) B樹(shù)(B-tree)索引到指定的列上,以便提升數(shù)據(jù)檢索速度。Elasticsearch 和 Lucene 使用了一個(gè)叫做倒排索引的結(jié)構(gòu)來(lái)達(dá)到相同的目的。

基礎(chǔ)入門/你知道的,為了搜索.../輕量搜索

我們使用下列請(qǐng)求來(lái)搜索索引庫(kù)為megacorp類型為employee所有文檔,一個(gè)搜索默認(rèn)返回十條結(jié)果:
GET /megacorp/employee/_search

基礎(chǔ)入門/你知道的,為了搜索.../使用查詢表達(dá)式搜索

使用 JSON 構(gòu)造了一個(gè)請(qǐng)求,查詢所有名為Smith的搜索:

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

基礎(chǔ)入門/你知道的,為了搜索.../全文搜索

Elasticsearch 默認(rèn)按照相關(guān)性得分排序,即每個(gè)文檔跟查詢的匹配程度。如果搜索的屬性中包含了要搜索的內(nèi)容(注意這里不是全部匹配)
,會(huì)在結(jié)果中展示。

基礎(chǔ)入門/你知道的,為了搜索.../短語(yǔ)搜索

找出一個(gè)屬性想要精確匹配一系列單詞或者短語(yǔ) 。(注意是一個(gè)屬性中,而且短語(yǔ)的單詞都是挨著的)。

基礎(chǔ)入門/你知道的,為了搜索.../分布式特性

Elasticsearch 盡可能地屏蔽了分布式系統(tǒng)的復(fù)雜性。這里列舉了一些在后臺(tái)自動(dòng)執(zhí)行的操作:
分配文檔到不同的容器或分片中,文檔可以儲(chǔ)存在一個(gè)或多個(gè)節(jié)點(diǎn)中。
按集群節(jié)點(diǎn)來(lái)均衡分配這些分片,從而對(duì)索引和搜索過(guò)程進(jìn)行負(fù)載均衡。
復(fù)制每個(gè)分片以支持?jǐn)?shù)據(jù)冗余,從而防止硬件故障導(dǎo)致的數(shù)據(jù)丟失。
將集群中任一節(jié)點(diǎn)的請(qǐng)求路由到存有相關(guān)數(shù)據(jù)的節(jié)點(diǎn)。
集群擴(kuò)容時(shí)無(wú)縫整合新節(jié)點(diǎn),重新分配分片以便從離群節(jié)點(diǎn)恢復(fù)。

基礎(chǔ)入門/集群內(nèi)的原理/空集群

一個(gè)運(yùn)行中的 Elasticsearch 實(shí)例稱為一個(gè)節(jié)點(diǎn),而集群是由一個(gè)或者多個(gè)擁有相同 cluster.name 配置的節(jié)點(diǎn)組成, 它們共同承擔(dān)數(shù)據(jù)和負(fù)載的壓力。當(dāng)有節(jié)點(diǎn)加入集群中或者從集群中移除節(jié)點(diǎn)時(shí),集群將會(huì)重新平均分布所有的數(shù)據(jù)。

當(dāng)一個(gè)節(jié)點(diǎn)被選舉成為 主 節(jié)點(diǎn)時(shí), 它將負(fù)責(zé)管理集群范圍內(nèi)的所有變更,例如增加、刪除索引,或者增加、刪除節(jié)點(diǎn)等。

基礎(chǔ)入門/集群內(nèi)的原理/集群健康

green
所有的主分片和副本分片都正常運(yùn)行。
yellow
所有的主分片都正常運(yùn)行,但不是所有的副本分片都正常運(yùn)行。
red
有主分片沒(méi)能正常運(yùn)行。

基礎(chǔ)入門/集群內(nèi)的原理/添加索引

一個(gè) 分片 是一個(gè)底層的 工作單元 ,它僅保存了全部數(shù)據(jù)中的一部分。 而現(xiàn)在我們只需知道一個(gè)分片是一個(gè) Lucene 的實(shí)例(??節(jié)點(diǎn)不是一個(gè)ES實(shí)例嗎??),以及它本身就是一個(gè)完整的搜索引擎。 我們的文檔被存儲(chǔ)和索引到分片內(nèi)。

Elasticsearch 是利用分片將數(shù)據(jù)分發(fā)到集群內(nèi)各處的。分片是數(shù)據(jù)的容器,文檔保存在分片內(nèi),分片又被分配到集群內(nèi)的各個(gè)節(jié)點(diǎn)里。

一個(gè)分片可以是 分片或者 副本 分片。 索引內(nèi)任意一個(gè)文檔都?xì)w屬于一個(gè)主分片,所以主分片的數(shù)目決定著索引能夠保存的最大數(shù)據(jù)量。一個(gè)副本分片只是一個(gè)主分片的拷貝。副本分片作為硬件故障時(shí)保護(hù)數(shù)據(jù)不丟失的冗余備份,并為搜索和返回文檔等讀操作提供服務(wù)。在索引建立的時(shí)候就已經(jīng)確定了主分片數(shù),但是副本分片數(shù)可以隨時(shí)修改。

基礎(chǔ)入門/集群內(nèi)的原理/水平擴(kuò)容

主分片的數(shù)目在索引創(chuàng)建時(shí)就已經(jīng)確定了下來(lái),定義了這個(gè)索引能夠 存儲(chǔ)的最大數(shù)據(jù)量。 但是,讀操作——搜索和返回?cái)?shù)據(jù)——可以同時(shí)被主分片或副本分片所處理,所以當(dāng)你擁有越多的副本分片時(shí),也將擁有越高的吞吐量。

基礎(chǔ)入門/數(shù)據(jù)輸入和輸出

JSON是一種以人可讀的文本表示對(duì)象的方法。當(dāng)一個(gè)對(duì)象被序列化成為 JSON,它被稱為一個(gè) JSON 文檔 。
在 Elasticsearch 中, 每個(gè)字段的所有數(shù)據(jù) 都是 默認(rèn)被索引的 。 即每個(gè)字段都有為了快速檢索設(shè)置的專用倒排索引。

基礎(chǔ)入門/數(shù)據(jù)輸入和輸出/文檔元數(shù)據(jù)

一個(gè)文檔不僅僅包含它的數(shù)據(jù) ,也包含 元數(shù)據(jù) —— 有關(guān) 文檔的信息。 三個(gè)必須的元數(shù)據(jù)元素如下:
_index
文檔在哪存放
_type
文檔表示的對(duì)象類別
_id
文檔唯一標(biāo)識(shí)

基礎(chǔ)入門/數(shù)據(jù)輸入和輸出/索引文檔

一個(gè)文檔的 _index 、 _type 和 _id 唯一標(biāo)識(shí)一個(gè)文檔,_id 可以自定義:

PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}

在 Elasticsearch 中每個(gè)文檔都有一個(gè)版本號(hào)。當(dāng)每次對(duì)文檔進(jìn)行修改時(shí)(包括刪除), _version 的值會(huì)遞增。
如果你的數(shù)據(jù)沒(méi)有自然的 ID, Elasticsearch 可以幫我們自動(dòng)生成 ID 。 請(qǐng)求的結(jié)構(gòu)調(diào)整為: 不再使用 PUT 謂詞, 而是使用 POST 謂詞。

POST /{index}/{type}
{
  "field": "value",
  ...
}

基礎(chǔ)入門/數(shù)據(jù)輸入和輸出/取回一個(gè)文檔

GET /website/blog/123?pretty
返回文檔的一部分:
GET /website/blog/123?_source=title,text
只想得到 _source 字段,不需要任何元數(shù)據(jù):
GET /website/blog/123/_source

基礎(chǔ)入門/數(shù)據(jù)輸入和輸出/更新整個(gè)文檔

在 Elasticsearch 中文檔是不可改變的。相反,如果想要更新現(xiàn)有的文檔,需要重建索引或者進(jìn)行替換。

PUT /website/blog/123
{
  "title": "My first blog entry",
...
}

基礎(chǔ)入門/數(shù)據(jù)輸入和輸出/創(chuàng)建新文檔

已有自己的_id,只有在相同的 _index 、 _type 和 _id 不存在時(shí)才接受我們的索引請(qǐng)求,兩種方式:

PUT /website/blog/123?op_type=create
{ ... }
PUT /website/blog/123/_create
{ ... }

基礎(chǔ)入門/數(shù)據(jù)輸入和輸出/刪除文檔

DELETE /website/blog/123

基礎(chǔ)入門/數(shù)據(jù)輸入和輸出/處理沖突

悲觀并發(fā)控制
這種方法被關(guān)系型數(shù)據(jù)庫(kù)廣泛使用,它假定有變更沖突可能發(fā)生,因此阻塞訪問(wèn)資源以防止沖突。 一個(gè)典型的例子是讀取一行數(shù)據(jù)之前先將其鎖住,確保只有放置鎖的線程能夠?qū)@行數(shù)據(jù)進(jìn)行修改。
樂(lè)觀并發(fā)控制
Elasticsearch 中使用的這種方法假定沖突是不可能發(fā)生的,并且不會(huì)阻塞正在嘗試的操作。 然而,如果源數(shù)據(jù)在讀寫當(dāng)中被修改,更新將會(huì)失敗。應(yīng)用程序接下來(lái)將決定該如何解決沖突。 例如,可以重試更新、使用新的數(shù)據(jù)、或者將相關(guān)情況報(bào)告給用戶。

基礎(chǔ)入門/數(shù)據(jù)輸入和輸出/文檔的部分更新

我們也介紹過(guò)文檔是不可變的:他們不能被修改,只能被替換。 update API 必須遵循同樣的規(guī)則。 從外部來(lái)看,我們?cè)谝粋€(gè)文檔的某個(gè)位置進(jìn)行部分更新。然而在內(nèi)部, update API 簡(jiǎn)單使用與之前描述相同的 檢索-修改-重建索引 的處理過(guò)程。

基礎(chǔ)入門/分布式文檔存儲(chǔ)/路由一個(gè)文檔到分片中

shard = hash(routing) % number_of_primary_shards
routing 是一個(gè)可變值,默認(rèn)是文檔的 _id ,也可以設(shè)置成一個(gè)自定義的值。 routing 通過(guò) hash 函數(shù)生成一個(gè)數(shù)字,然后這個(gè)數(shù)字再除以 number_of_primary_shards (主分片的數(shù)量)后得到 余數(shù) 。這個(gè)分布在 0 到 number_of_primary_shards-1 之間的余數(shù),就是我們所尋求的文檔所在分片的位置。

基礎(chǔ)入門/分布式文檔存儲(chǔ)/主分片和父分片如何交互

我們可以發(fā)送請(qǐng)求到集群中的任一節(jié)點(diǎn)。 每個(gè)節(jié)點(diǎn)都有能力處理任意請(qǐng)求。 每個(gè)節(jié)點(diǎn)都知道集群中任一文檔位置,所以可以直接將請(qǐng)求轉(zhuǎn)發(fā)到需要的節(jié)點(diǎn)上。

基礎(chǔ)入門/搜索

Elasticsearch 不只會(huì)存儲(chǔ)(stores)文檔,為了能被搜索到也會(huì)為文檔。
搜索重要概念:
添加索引(indexes)
映射(Mapping)
描述數(shù)據(jù)在每個(gè)字段內(nèi)如何存儲(chǔ)
分析(Analysis)
全文是如何處理使之可以被搜索的
領(lǐng)域特定查詢語(yǔ)言(Query DSL)
Elasticsearch 中強(qiáng)大靈活的查詢語(yǔ)言

基礎(chǔ)入門/搜索/空搜索

返回集群中所有索引的文檔:
GET /_search
hits
hits它包含total字段來(lái)表示匹配到的文檔總數(shù),并且一個(gè) hits數(shù)組包含所查詢結(jié)果的前十個(gè)文檔。
在 hits 數(shù)組中每個(gè)結(jié)果包含文檔的** _index 、 _type 、 _id ,加上 _source 字段。
每個(gè)結(jié)果還有一個(gè)
_score ,它衡量了文檔與查詢的匹配程度**。默認(rèn)情況下,首先返回最相關(guān)的文檔結(jié)果,就是說(shuō),返回的文檔是按照 _score 降序排列的。
max_score 值是與查詢所匹配文檔的 _score 的最大值。
_shards 部分告訴我們?cè)诓樵冎袇⑴c分片的總數(shù),以及這些分片成功了多少個(gè)失敗了多少個(gè)。

基礎(chǔ)入門/搜索/多索引,多類型

/gb,us/user,tweet/_search
在 gb 和 us 索引中搜索 user 和 tweet 類型

基礎(chǔ)入門/搜索/輕量搜索

查詢?cè)?tweet 類型中 tweet 字段包含 elasticsearch 單詞的所有文檔:
GET /_all/tweet/_search?q=tweet:elasticsearch
返回包含 mary 的所有文檔:
GET /_search?q=mary
當(dāng)索引一個(gè)文檔的時(shí)候,Elasticsearch 取出所有字段的值拼接成一個(gè)大的字符串,作為 _all 字段進(jìn)行索引

基礎(chǔ)入門/映射和分析/分析與分析器

分析器 實(shí)際上是將三個(gè)功能封裝到了一個(gè)包里:
字符過(guò)濾器
首先,字符串按順序通過(guò)每個(gè) 字符過(guò)濾器 。他們的任務(wù)是在分詞前整理字符串。一個(gè)字符過(guò)濾器可以用來(lái)去掉HTML,或者將 & 轉(zhuǎn)化成 and。
分詞器
其次,字符串被 分詞器 分為單個(gè)的詞條。一個(gè)簡(jiǎn)單的分詞器遇到空格和標(biāo)點(diǎn)的時(shí)候,可能會(huì)將文本拆分成詞條。
Token 過(guò)濾器
最后,詞條按順序通過(guò)每個(gè) token 過(guò)濾器。這個(gè)過(guò)程可能會(huì)改變?cè)~條(例如,小寫化 Quick ),刪除詞條(例如, 像 a, andthe 等無(wú)用詞),或者增加詞條(例如,像 jumpleap 這種同義詞)。

基礎(chǔ)入門/映射和分析/映射

為了能夠?qū)r(shí)間域視為時(shí)間,數(shù)字域視為數(shù)字,字符串域視為全文或精確值字符串, Elasticsearch 需要知道每個(gè)域中數(shù)據(jù)的類型。這個(gè)信息包含在映射中。

簡(jiǎn)單域類型
字符串: string
整數(shù) : byte, short, integer, long
浮點(diǎn)數(shù): float, double
布爾型: boolean
日期: date

默認(rèn), string 類型域會(huì)被認(rèn)為包含全文。就是說(shuō),它們的值在索引前,會(huì)通過(guò)一個(gè)分析器,針對(duì)于這個(gè)域的查詢?cè)谒阉髑耙矔?huì)經(jīng)過(guò)一個(gè)分析器。
string 域映射的兩個(gè)最重要屬性是 index 和 analyzer
index 屬性控制怎樣索引字符串。它可以是下面三個(gè)值:
analyzed
首先分析字符串,然后索引它。換句話說(shuō),以全文索引這個(gè)域。
not_analyzed
索引這個(gè)域,所以它能夠被搜索,但索引的是精確值。不會(huì)對(duì)它進(jìn)行分析。
no
不索引這個(gè)域。這個(gè)域不會(huì)被搜索到。
對(duì)于 analyzed 字符串域,用 analyzer 屬性指定在搜索和索引時(shí)使用的分析器。默認(rèn), Elasticsearch 使用 standard 分析器, 但你可以指定一個(gè)內(nèi)置的分析器替代它,例如 whitespace 、 simple 和 english。

基礎(chǔ)入門/映射和分析/復(fù)雜核心域類型

復(fù)雜核心域類型:JSON 還有 null 值,數(shù)組,和對(duì)象
Lucene 不理解內(nèi)部對(duì)象。 Lucene 文檔是由一組鍵值對(duì)列表組成的。為了能讓 Elasticsearch 有效地索引內(nèi)部類,它把我們的文檔轉(zhuǎn)化成這樣:

{
    "tweet":            [elasticsearch, flexible, very],
    "user.id":          [@johnsmith],
    "user.gender":      [male],
    "user.age":         [26],
    "user.name.full":   [john, smith],
    "user.name.first":  [john],
    "user.name.last":   [smith]
}

基礎(chǔ)入門/請(qǐng)求體查詢/空查詢

空查詢將返回所有索引庫(kù)(indices)中的所有文檔:
GET /_search
{}

基礎(chǔ)入門/請(qǐng)求體查詢/查詢表達(dá)式

一個(gè)簡(jiǎn)單的查詢:查詢 tweet 字段中包含 elasticsearch 的文檔
GET /_search
{
"query": {
"match": {?
"tweet": "elasticsearch"
}
}
}

復(fù)雜一點(diǎn)的查詢:復(fù)合(Compound) 語(yǔ)句 主要用于 合并其它查詢語(yǔ)句:
{
"bool": {
"must": { "match": { "tweet": "elasticsearch" }},
"must_not": { "match": { "name": "mary" }},
"should": { "match": { "tweet": "full text" }},
"filter": { "range": { "age" : { "gt" : 30 }} }
}
}

基礎(chǔ)入門/請(qǐng)求體查詢/查詢與過(guò)濾

過(guò)濾(filter)
查詢被設(shè)置成一個(gè)“不評(píng)分”或者“過(guò)濾”查詢?;卮鹨彩欠浅5暮?jiǎn)單,yes 或者 no ,二者必居其一。
查詢(query)
查詢就變成了一個(gè)“評(píng)分”的查詢。和不評(píng)分的查詢類似,也要去判斷這個(gè)文檔是否匹配,同時(shí)它還需要判斷這個(gè)文檔匹配的有 多好(匹配程度如何)。

基礎(chǔ)入門/請(qǐng)求體查詢/最重要的查詢

match_all查詢:簡(jiǎn)單的匹配所有文檔。在沒(méi)有指定查詢方式時(shí),它是默認(rèn)的查詢。
match查詢
如果你在一個(gè)全文字段上使用 match 查詢,在執(zhí)行查詢前,它將用正確的分析器去分析查詢字符串。
如果在一個(gè)精確值的字段上使用它,例如數(shù)字、日期、布爾或者一個(gè) not_analyzed 字符串字段,那么它將會(huì)精確匹配給定的值。
對(duì)于精確值的查詢,你可能需要使用 filter 語(yǔ)句來(lái)取代 query,因?yàn)?filter 將會(huì)被緩存。
multi_match查詢:可以在多個(gè)字段上執(zhí)行相同的 match 查詢。

{
    "multi_match": {
        "query":    "full text search",
        "fields":   [ "title", "body" ]
    }
}

range查詢:找出那些落在指定區(qū)間內(nèi)的數(shù)字或者時(shí)間。
term查詢:被用于精確值匹配,這些精確值可能是數(shù)字、時(shí)間、布爾或者那些 not_analyzed 的字符串。

{ "term": { "age":    26           }}
{ "term": { "date":   "2014-09-01" }}

terms查詢:和 term 查詢一樣,但它允許你指定多值進(jìn)行匹配。如果這個(gè)字段包含了指定值中的任何一個(gè)值,那么這個(gè)文檔滿足條件。
exists查詢和 missing查詢:被用于查找那些指定字段中有值 (exists) 或無(wú)值 (missing) 的文檔。

基礎(chǔ)入門/請(qǐng)求體查詢/組合多查詢

你可以用 bool 查詢來(lái)實(shí)現(xiàn)你的需求。這種查詢將多查詢組合在一起,成為用戶自己想要的布爾查詢。它接收以下參數(shù):
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)排除或包含文檔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容