上一篇文章說的的有關于Elasticsearch提供的Result fulAPi的CRUD操作的一些命令,下面和大家繼續介紹有關Elasticsearch相關的操作!
概述目錄
①Elasticsearch索引文檔添加
②Elasticsearch索引映射Mappings
③Elasticsearch索引中字段的數據類型
④Elasticsearch狀態查詢
Elasticsearch 7版本之后
Elasticsearch7版本之后創建索引注意事項:
①索引type屬性不能指定
②索引類型默認為_doc
Elasticsearch索引文檔添加
添加
添加一個ID為1的“外部”類型到引中,如下所示
# 給定索引中添加一個域(Filed:name)
$ curl -H "Content-Type:application/json" -XPUT 'http://127.0.0.1:9200/my_index/external/1?pretty' -d '{"name":"我是小明"}'
刪除
# 刪除指定索引的數據
$ curl -H "Content-Type:application/json" -XDELETE 'http://127.0.0.1:9200/my_index/external/1?pretty'
更新
除了能夠創建和查詢之外,我們還可以更新文檔
# 給定索引進行數據的更新操作
$ curl -H "Content-Type:application/json" -XPOST 'http://localhost:9200/my_index/external/1/_update?pretty' -d '{"name":"我是小紅"}'
Elasticsearch索引映射Mappings
Mapping就是索引庫中對文檔及其包含的字段的存儲和索引方式的定義,類似于數據庫中的表結構信息。不過es的Mapping比數據庫靈活很多,它可以自動識別字段。一般不需要指定Mapping都可以,因為es會自動根據數據格式識別它的類型,但如果你需要對某些字段添加特殊屬性(如:定義使用其它分詞器、是否分詞、是否存儲等),就必須手動添加Mapping。Mapping主要作用如下 :
①定義Index下字段名(Field Name)
②定義字段的類型,比如數值型,字符串型、布爾型等
③定義倒排索引的相關配置,比如是否索引、記錄postion等
元字段
ES內置的已經準備好可以供用戶使用的內置關鍵字,用戶es內部相關操作。元字段有如下幾種類型:
①標識元字段(_id, _index, _type)
②來源元資源(_source,_size)
③索引元字段(_all)
④路由元字段(_routing)
⑤其他元字段(_meta)
id
document的唯一標識。它與_index和_type一起,唯一標識和定位一個document。
type
用來標識document屬于什么映射類型。該字段在6.0.0中棄用。在Elasticsearch 6.x 版本中創建的索引只能包含單個type。在5.x中創建的含有多個type的索引將繼續像以前一樣在Elasticsearch 6.x中運行。在Elasticsearch 7.0.0中刪除。
index
用來標識document屬于哪個index,是一個虛擬字段,不會被添加到索引中。
source
用于存儲原始的JSON文檔內容,本身不會被索引,但是搜索的時候被返回。如果被禁用,只知道有匹配內容,但是具體內容。
size
存儲_source字段占用的字節數。
all
該字段用于在沒有指定具體字段的情況下進行模糊搜索,可以搜索全部字段的內容。其原理是將所有字段的內容視為字符串,拼在一起放在一個_all字段上,但這個字段默認可以被分析和索引,但不會被存儲。
在Elasticsearch 6.0版本中,_all字段已經被禁用了。若要開啟,官方建議是: _all已經不允許使用了,作為替換,可以使用copy_to關鍵字來創建需要獲取的所有字段的內容。
routing
用于將文檔路由到指定的分片上。如果不指定routing的值, 默認使用文檔的id字段。如果存在父文檔則使用其_parent的編號。
可以通過為某些文檔都指定相同的路由值,來實現對這些文檔的自定義路由功能。
meta
自定義一些自定義的信息存放到這個元字段。
analyzer
指定分析器,對索引和查詢都有效
normalizer
用于解析前過濾工作,比如:把所有字符轉化為小寫。
boost
boost字段用于設置字段的權重,比如,關鍵字出現在title字段的權重是出現在content字段中權重的2倍,設置mapping如下,其中content字段的默認權重是1。
推薦在查詢時指定boost,第一中在mapping中寫死,如果不重新索引文檔,權重無法修改,使用查詢可以實現同樣的效果。
coerce
coerce屬性用于清除臟數據,coerce的默認值是true。整型數字5有可能會被寫成字符串"5"或者浮點數5.0。coerce屬性可以用來清除臟數據:
①字符串會被強制轉換為整數
②浮點數被強制轉換為整數
mapping中指定age字段是integer類型,雖然插入的數據類型是String,但依然可以插入成功。salary字段關閉了coerce,因此插入失敗。
copy_to
copy_to屬性用于配置自定義的_all字段(多個字段合并成一個超級字段)。比如,first_name和last_name可以合并為full_name字段。
doc_values
doc_values是為了加快排序、聚合操作,在建立倒排索引的時候,額外增加一個列式存儲映射,是一個空間換時間的做法。默認是開啟的,對于確定不需要聚合或者排序的字段可以關閉。
text字段不支持doc_values。
dynamic
dynamic屬性用于檢測新字段,有三個選項:
①true:新發現的字段自動添加到映射中
②false:新發現的字段被忽略,必須顯式添加字段
③strict:如果檢測到新字段,拋出異常并拒絕添加文檔。
enabled
ES默認會索引所有的字段。但是enabled為false的字段,ES會跳過字段的內容,不可以被搜索,可以從_source字段中獲取內容。
fielddata
多數字段在索引時生成doc_values,但是text字段不支持doc_values。
取而代之,text字段在查詢時會生成一個fielddata的數據結構,fielddata在字段首次被聚合、排序、或者使用腳本的時候生成。ES通過讀取磁盤上的倒排記錄表重新生成文檔詞項關系,最后在Java堆內存中排序。
text字段的fielddata屬性默認是關閉的,開啟fielddata非常消耗內存。在你開啟text字段以前,想清楚為什么要在text類型的字段上做聚合、排序操作。大多數情況下這么做是沒有意義的。
format
format屬性主要用于格式化日期
ignore_above
ignore_above用于指定字段索引和存儲的長度最大值,超過最大值的會被忽略
mapping中指定了ignore_above字段的最大長度為15,文檔種的字段大于15,因此不索引,查詢是也無法返回該條記錄。
ignore_malformed
ignore_malformed可以忽略不規則數據。給一個字段索引不合適的數據類型發生異常,導致整個文檔索引失敗。如果ignore_malformed參數設為true,異常會被忽略,出異常的字段不會被索引,其它字段正常索引。
include_in_all
include_in_all屬性用于指定字段是否包含在_all字段里面,默認開啟。
如:title 和 content 字段包含在 _all 字段里,date不包含。
include_in_all也可用于字段級別,如my_type下的所有字段都排除在_all字段之外。
index
index屬性指定字段是否索引,不索引就不可搜索,值可以為true或者false。
index_options
index_options控制索引時存儲哪些信息到倒排索引中,接受以下配置:
①docs 只存儲文檔編號
②freqs 存儲文檔編號和詞項頻率
③positions 文檔編號、詞項頻率、詞項的位置被存儲,偏移位置可用于臨近搜索和短語查詢
④offsets 文檔編號、詞項頻率、詞項的位置、詞項開始和結束的字符位置都被存儲,offsets設為true會使用Postings highlighter
fields
出于多領域應用的目的,以不同的方式對同一字段建立索引通常很有用。例如,一個string 字段可以映射為text用于全文搜索的字段,也可以映射為keyword用于排序或聚合的字段。
null_value
值為null的字段不被索引也不可以搜索,null_value參數可以讓值為null的字段顯式的可索引、可搜索。
position_increment_gap
為了支持近似或者短語查詢,text字段被解析的時候會考慮此項的位置信息。
similarity
similarity參數用于指定文檔評分模型,參數有三個:
①classic :TF/IDF評分模型
②boolean:布爾評分模型
③BM25 :ES和Lucene默認的評分模型
default_field自動使用BM25評分模型,classic_field使用TF/IDF經典評分模型,boolean_sim_field使用布爾評分模型。
search_analyzer
大多數情況下索引和搜索的時候應該指定相同的分析器,確保query解析以后和索引中的詞項一致。但是有時候也需要指定不同的分析器,例如使用edge_ngram過濾器實現自動補全。
默認情況下查詢會使用analyzer屬性指定的分析器,但也可以被search_analyzer覆蓋。
properties
Object類型或者nested類型,因為有層級嵌套,所以我們可以通過properties來指定這種層級嵌套關系。
store
默認情況下,字段被索引也可以搜索,但是不存儲,因為_source字段里面保存了一份原始文檔。在某些情況下,比如一個文檔里面有title、date和超大的content字段,如果只想獲取title和date。
term_vector
詞向量包含了文本被解析以后的以下信息:
①詞項集合
②詞項位置
③詞項的起始字符映射到原始文檔中的位置。
term_vector參數有以下取值:
參數 | 解釋 |
---|---|
yes | 只存儲詞項集合 |
with_positions | 存儲詞項和詞項位置 |
with_offsets | 詞項和字符偏移位置 |
with_positions_offsets | 存儲詞項、詞項位置、字符偏移位置 |
e·g·
# 創建一個name為text的域,并且分詞類型采用IK的粗粒度分詞
$ curl -H "Content-Type:application/json" -XPUT 'http://localhost:9200/my_index4' -d '{"mappings":{"properties":{"name":{"type":"text","analyzer":"ik_max_word"}}}}'
# ik分詞器有兩種類型一種是ik_max_word :粗粒度分詞(多分)一種是: ik_smart:細粒度分詞
動態Mapping
ES中有一個非常重要的特性——動態映射,即索引文檔前不需要創建索引、類型等信息,在索引的同時會自動完成索引、類型、映射的創建。映射就是描述字段的類型、如何進行分析、如何進行索引等內容。
ES在文檔中碰到一個以前沒見過的字段時,它會利用動態映射來決定該字段的類型,并自動地對該字段添加映射。這個可以通過dynamic屬性去控制,dynamic屬性為false會忽略新增的字段、dynamic屬性為strict會拋出異常。如果dynamic為true的話,es會自動根據字段的值推測出來類型進而確定mapping。
動態模板
通過 dynamic_templates,可以擁有對新字段的動態映射規則擁有完全的控制。可以設置根據字段名稱或者類型來使用一個不同的映射規則。
每個模板都有一個名字,可以用來描述這個模板做了什么。同時它有一個 mapping 用來指定具體的映射信息,和至少一個參數(比如 match)用來規定對于什么字段需要使用該模板。
模板的匹配是有順序的 - 第一個匹配的模板會被使用。
Elasticsearch索引中字段的數據類型
字段數據類型
每個字段都有一個數據type,數據類型主要有以下類型:
①數值型: long integer short float double float half_float scaled_float
②范圍型: integer_range, float_rangt, long_range, double_range, date_range, ip_range
③簡單型: text, keyword, date, boolean, ip
④復雜型: array, geo, object, nested
text
可以被全文搜索。字段內容會被分析,再生成倒排索引。不能夠排序,很少用于聚合。
keyword
keyword類型適用于索引結構化的字段,比如email地址、主機名、狀態碼和標簽。如果字段需要進行過濾、排序、聚合,則需要keyword字段類型。keyword類型的字段只能通過精確值搜索到。
date
由于JSON中沒有日期類型,所以在Elasticsearch中,日期類型可以是以下幾種: 日期格式的字符串、 long類型的毫秒數、 integer的秒數。
object
使用JSON天然的格式來自動推斷Object。
array
ES沒有專用的數組類型,默認情況下任何字段都可以包含一個或者多個值,但是一個數組中的值要是同一種類型。例如:
①字符數組:[ "one", "two" ]
②整型數組:[1, 3]
③嵌套數組:[1, [2, 3]],等價于[1, 2, 3]
④對象數組:[ { "name": "Mary", "age": 12 }, {"name": "John", "age": 10 }]
binary
binary類型默認不存儲也不可以被搜索,接受base64編碼的字符串。
ip
ip類型的字段用于存儲IPV4或者IPV6的地址。
range
range類型支持: integer_range, float_rangt, long_range, double_range, date_range, ip_range
nested
nested嵌套類型是object中的一個特例,可以讓array類型的Object獨立索引和查詢。
token_count
token_count字段是一個數值字段,但是它接受的是字符串。會對接受的字符串進行分析,然后索引字符串的詞數。
geo_point
geo_point 類型的字段接受緯度-經度對,可以使用:
①找出落在指定矩形框、多邊形、圓形中的坐標點
②以地理位置 或距中心點的距離匯總文檔
③按距離打分
④按距離排序
e·g·
# 創建一個索引,指定當中一個域的數據類型
$ curl -H "Content-Type:application/json" -XPUT 'http://localhost:9200/my_index3' -d '{"mappings":{"properties":{"name":{"type":"text"}}}}'
Elasticsearch狀態查詢
Rest API | 說明 |
---|---|
/_cat/allocation | 查詢磁盤存儲信息 |
/_cat/shards | 查詢索引分片信息 |
/_cat/shards/{index} | 查詢某個索引的分片信息 |
/_cat/master | 查詢master節點信息 |
/_cat/nodes | 查詢集群節點信息 |
/_cat/tasks | 查詢任務信息 |
/_cat/indices | 查詢索引信息 |
/_cat/indices/{index} | 查詢某個具體索引的信息 |
/_cat/segments | 查詢段信息 |
/_cat/segments/{index} | 查詢段中的某個索引信息 |
/_cat/count | 查詢群集的文檔數 |
/_cat/count/{index} | 查詢群集中單個索引的文檔數 |
/_cat/recovery | 查詢索引分片恢復的視圖,包括正在進行和先前已完成的恢復。只要索引分片移動到群集中的其他節點,就會發生恢復事件。在快照恢復,復制級別更改,節點故障或節點啟動期間可能會發生這種情況。 |
/_cat/pending_tasks | 查詢等待中的任務 |
/_cat/aliases | 查詢索引的當前配置別名的信息,包括過濾器和路由信息 |
/_cat/aliases/{alias} | 查詢索引的當前配置別名的信息,包括過濾器和路由信息 |
/_cat/thread_pool | 查詢每個節點的群集范圍線程池統計信息。默認情況下,為所有線程池返回活動,隊列和拒絕的統計信息。 |
/_cat/plugins | 查詢運行插件的每個節點的視圖 |
/_cat/fielddata | 查詢集群中每個數據節點上fielddata當前正在使用的堆內存量 |
/_cat/nodeattrs | 查詢自定義節點屬性 |
/_cat/repositories | 查詢群集中注冊的快照存儲庫 |
/_cat/templates | 查詢現有模板的信息 |
e·g·
# 集群健康
$ curl -XGET http://localhost:9200/_cat/nodes?v
# 查詢現有模板的信息
$ curl -XGET 'http://localhost:9200/_cat/templates'