03.04 elasticsearch基礎


索引--保存相關數據的地方,實際上是指向一個或者多個物理分片的邏輯明名空間。

集群內的原理

es支持垂直擴容,水平擴容,但是垂直擴容是有極限的,真正的擴容能力來自於水平擴容(為集群添加更多的節點,並將負載及穩定性型分散到這些節點中)

一個運行中的es實例稱為一個節點,集群就是由多個擁有相同cluster.name節點組成,集群中有一個節點會被選中為主節點。主節點負責集群範圍內所有索引(存儲文檔的數據庫)及節點的新增,及刪除等,主節點不會參與到文檔添加及更新,所以只有一個主節點不會成為性能的瓶頸。用戶可以把請求發送到任意一個節點,每個節點知道任意文檔所在的位置,它能找到文檔所在的各個節點並蒐集返回到客戶端。

集群健康


<code>GET /_cluster/health/<code>


<code>{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 4,
"number_of_data_nodes": 4,
"active_primary_shards": 15,
"active_shards": 30,

"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100
}/<code>

status字段表示集群總體工作狀態 green 所有主分片和副分片都正常運行。yellow主分片正常運行,但是不是所有的副分片都正常運行。red有主分片沒有正常運行。

索引分片


<code>PUT /{index_name}/<code>


<code>{
"settings":{
"number_of_shards":5,//索引分片數目
"number_of_replicas":1//備份數量
}
}/<code>

索引--保存相關數據的地方,實際上是指向一個或者多個物理分片的邏輯明名空間。分片是數據的容器,文檔被保存在分片裡,分片被保存在各個節點裡面。當集群規模擴大或者縮小,es會自動遷移分片,使得數據均勻分佈在各個節點上面。

一個分片理論上能存儲 Integer.MAX_VALUE-128個文檔,具體和文檔大小,及硬件有關。所以一個索引能存儲的最大文檔數量由分片數目決定。

數據輸入和輸出


文檔元數據

_index 文檔存放在哪兒 索引名字 參照關係數據庫的數據庫名字

_type 同一個索引下的不同數據類型 參照關係數據庫的表名

_version (版本)號,當文檔被修改時版本號遞增

_id id及 type 、_index 可以唯一確定一個es文檔,可以自己提供,也可以由es生成

_all 將所有字段拼接在一起,用於全文搜索

文檔操作


添加文檔


<code>PUT /{index}/{type}/{id}
{"fileds":"values"
....
}
PUT /{index}/{type}/?op_type=create
PUT /{index}/{type}/_reate
/<code>


搜索文檔


<code>GET /{index}/{type}/{id}
HEAD /{index}/{type}/{id} //檢查文檔是否存在
GET /{index}/{type}/_search //該索引該類型返回所有文檔
GET /{index}/{type}/{id}?_source=title,text //返回文檔的一部分
GET _mget //取回多個文檔 也可以在url中指定默認的index 及type
{
"docs" : [
{
"_index" : "janusgraph_test_node_index",
"_type" : "test_node_index",
"_id" : "147ig"
}
]
}/<code>


更新文檔


<code>PUT /{index}/{type}/{id}/<code>


創建文檔


<code>POST /{index}/{type}/
PUT /{index}/{type}//<code>


刪除文檔


<code>DELETE /{index}/{type}/{id}/<code>


樂觀併發控制

es為每個文檔維護了一個版本號_version 修改數據的時候可以指定版本號 `PUT /{index}/{type}/{id}?version=1` ,通過指定想要修改文檔的 `version` 號來達到這個目的。 如果該版本不是當前版本號,我們的請求將會失敗。

也可以使用外部系統的版本號PUT /{index}/{type}/{id}?version=1&versiontype=external 外部版本號的處理方式和我們之前討論的內部版本號的處理方式有些不同, Elasticsearch 不是檢查當前 version 和請求中指定的版本號是否相同, 而是檢查當前 version 是否 *小於* 指定的版本號。 如果請求成功,外部的版本號作為文檔的新 version` 進行存儲。

搜索


返回字段

hits:返回結果中最重要的部分是 hits ,它 包含 total 字段來表示匹配到的文檔總數,並且一個 hits 數組包 含所查詢結果的前十個文檔。在 hits 數組中每個結果包含文檔的 _index 、 _type 、 _id ,加上 _source 字段。每個結果還有一個 _score ,它衡量了文檔與查詢的匹配程度。

took 執行整個搜索請求耗費了多少毫秒。

_shards參與分片的總數,以及這些分片成功了多少個失敗了多少個。

timed_out 詢是否超時。

多索引多類型搜索

/_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 類型

分頁


<code>GET /_search?size=5&from=5/<code>


映射與分析

es 支持精確搜索和全文搜索,精確搜索就是嚴格的相等;全文搜索,就是會對詞進行分析,比如搜索中國,能得到中華人民共和國 這樣的結果

倒排索引

Elasticsearch 使用一種稱為 倒排索引 的結構,它適用於快速的全文搜索。一個倒排索引由文檔中所有不重複詞的列表構成,對於其中每個詞,有一個包含它的文檔列表。

例如,假設我們有兩個文檔,每個文檔的 content 域包含如下內容:

  1. The quick brown fox jumped over the lazy dog
  2. Quick brown foxes leap over lazy dogs in summer

為了創建倒排索引,我們首先將每個文檔的 content 域拆分成單獨的 詞(我們稱它為 詞條 或 tokens ),創建一個包含所有不重複詞條的排序列表,然後列出每個詞條出現在哪個文檔。結果如下所示:

<code>Term      Doc_1  Doc_2
-------------------------
Quick | | X
The | X |
brown | X | X
dog | X |
dogs | | X
fox | X |
foxes | | X
in | | X
jumped | X |
lazy | X | X
leap | | X
over | X | X
quick | X |
summer | | X
the | X |
------------------------/<code>

現在,如果我們想搜索 quick brown ,我們只需要查找包含每個詞條的文檔:

<code>Term      Doc_1  Doc_2
-------------------------
brown | X | X
quick | X |
------------------------
Total | 2 | 1/<code>

兩個文檔都匹配,但是第一個文檔比第二個匹配度更高。如果我們使用僅計算匹配詞條數量的簡單 相似性算法 ,那麼,我們可以說,對於我們查詢的相關性來講,第一個文檔比第二個文檔更佳。

倒排索引還會有一些問題,比如,大小寫,還有相同意思的單詞。這就需要分析器來處理了。

分析與分析器

分析器包含三個部分的功能

字符過濾器

首先,字符串按順序通過每個 字符過濾器 。他們的任務是在分詞前整理字符串。一個字符過濾器可以用來去掉HTML,或者將 & 轉化成 and。

分詞器

其次,字符串被 分詞器 分為單個的詞條。一個簡單的分詞器遇到空格和標點的時候,可能會將文本拆分成詞條。

Token 過濾器

最後,詞條按順序通過每個 token 過濾器 。這個過程可能會改變詞條(例如,小寫化 Quick ),刪除詞條(例如, 像 a, and, the 等無用詞),或者增加詞條(例如,像 jump 和 leap 這種同義詞)。

內置分析器

標準分析器

標準分析器是Elasticsearch默認使用的分析器。它是分析各種語言文本最常用的選擇。它根據 http://www.unicode.org/reports/tr29/ 定義的 單詞邊界 劃分文本。刪除絕大部分標點。

簡單分析器

簡單分析器在任何不是字母的地方分隔文本,將詞條小寫。

空格分析器

空格分析器在空格的地方劃分文本。它會產生

語言分析器

特定語言分析器可用於 https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-lang-analyzer.html。它們可以考慮指定語言的特點。例如, 英語 分析器附帶了一組英語無用詞(常用單詞,例如 and 或者 the ,它們對相關性沒有多少影響),它們會被刪除。 由於理解英語語法的規則,這個分詞器可以提取英語單詞的 詞幹 。

<code>GET /_analyze
{
"analyzer": "standard",
"text": "Text to analyze"
}/<code>


映射

內部對象的數組是如何被索引的。 假設我們有個 followers 數組:

<code>{
"followers": [
{ "age": 35, "name": "Mary White"},
{ "age": 26, "name": "Alex Jones"},
{ "age": 19, "name": "Lisa Smith"}

]
}/<code>

這個文檔會像我們之前描述的那樣被扁平化處理,結果如下所示:

<code>{
"followers.age": [19, 26, 35],
"followers.name": [alex, jones, lisa, smith, mary, white]
}/<code>

內部對象如何映射

<code>{
"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]
}/<code>

內部域 可以通過名稱引用(例如, first )。為了區分同名的兩個域,我們可以使用全 路徑 (例如, user.name.first ) 或 type 名加路徑( tweet.user.name.first )。

查詢


查詢表達式

一個查詢語句 的典型結構:

<code>{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}/<code>

如果是針對某個字段,那麼它的結構如下:

<code>{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}/<code>


主要的ARGUMENT

match_all:查詢簡單的 匹配所有文檔。

match:無論你在任何字段上進行的是全文搜索還是精確查詢,match 查詢是你可用的標準查詢。

multi_match:查詢可以在多個字段上執行相同的 match 查詢

range:查詢找出那些落在指定區間內的數字或者時間

term:查詢被用於精確值 匹配,這些精確值可能是數字、時間、布爾或者那些 not_analyzed 的字符串

terms:terms 查詢和 term 查詢一樣,但它允許你指定多值進行匹配。它查詢那些精確匹配的值(包括在大小寫、重音、空格等方面的差異)。

exits:文檔中某個屬性有值

missing:同exits相反

多組合查詢


<code>{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }}
],
"filter": {
"bool": {
"must": [
{ "range": { "date": { "gte": "2014-01-01" }}},
{ "range": { "price": { "lte": 29.99 }}}
],
"must_not": [
{ "term": { "category": "ebooks" }}
]
}
}
}
}/<code>


排序


<code>GET /_search
{
"query" : {
"bool" : {
"filter" : { "term" : { "user_id" : 1 }}
}
},
"sort":[
{ "date": { "order": "desc" }},
{ "_score": { "order": "desc" }}
]
}/<code>


索引管理


創建索引


<code>PUT /my_index
{
"settings": { ... any settings ... },
"mappings": {
"type_one": { ... any mappings ... },
"type_two": { ... any mappings ... },
...
}
}/<code>


刪除索引


<code>DELETE /my_index/<code>


配置分析器


<code>PUT /spanish_docs
{
"settings": {
"analysis": {
"analyzer": {
"es_std": {
"type": "standard",
"stopwords": "_spanish_"

}
}
}
}
}/<code>

本文由博客群發一文多發等運營工具平臺 https://openwrite.cn?from=article_bottom 發佈


分享到:


相關文章: