上一篇文章說的的有關于Elasticsearch提供的Result fulAPi的CRUD操作的一些命令他嫡,下面和大家繼續(xù)介紹有關Elasticsearch相關的操作!
概述目錄
①Elasticsearch索引文檔添加
②Elasticsearch索引映射Mappings
③Elasticsearch索引中字段的數據類型
④Elasticsearch狀態(tài)查詢
Elasticsearch 7版本之后
Elasticsearch7版本之后創(chuàng)建索引注意事項:
①索引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'
更新
除了能夠創(chuàng)建和查詢之外钢属,我們還可以更新文檔
# 給定索引進行數據的更新操作
$ 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 版本中創(chuàng)建的索引只能包含單個type塑径。在5.x中創(chuàng)建的含有多個type的索引將繼續(xù)像以前一樣在Elasticsearch 6.x中運行。在Elasticsearch 7.0.0中刪除填具。
index
用來標識document屬于哪個index统舀,是一個虛擬字段,不會被添加到索引中灌旧。
source
用于存儲原始的JSON文檔內容绑咱,本身不會被索引,但是搜索的時候被返回枢泰。如果被禁用描融,只知道有匹配內容,但是具體內容衡蚂。
size
存儲_source字段占用的字節(jié)數窿克。
all
該字段用于在沒有指定具體字段的情況下進行模糊搜索骏庸,可以搜索全部字段的內容。其原理是將所有字段的內容視為字符串年叮,拼在一起放在一個_all字段上具被,但這個字段默認可以被分析和索引,但不會被存儲只损。
在Elasticsearch 6.0版本中一姿,_all字段已經被禁用了。若要開啟跃惫,官方建議是: _all已經不允許使用了叮叹,作為替換,可以使用copy_to關鍵字來創(chuàng)建需要獲取的所有字段的內容爆存。
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:新發(fā)現的字段自動添加到映射中
②false:新發(fā)現的字段被忽略蟆湖,必須顯式添加字段
③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可以忽略不規(guī)則數據歧譬。給一個字段索引不合適的數據類型發(fā)生異常,導致整個文檔索引失敗搏存。如果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·
# 創(chuàng)建一個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:細粒度分詞
動態(tài)Mapping
ES中有一個非常重要的特性——動態(tài)映射扣孟,即索引文檔前不需要創(chuàng)建索引烫堤、類型等信息,在索引的同時會自動完成索引凤价、類型鸽斟、映射的創(chuàng)建。映射就是描述字段的類型利诺、如何進行分析富蓄、如何進行索引等內容。
ES在文檔中碰到一個以前沒見過的字段時慢逾,它會利用動態(tài)映射來決定該字段的類型立倍,并自動地對該字段添加映射。這個可以通過dynamic屬性去控制侣滩,dynamic屬性為false會忽略新增的字段口注、dynamic屬性為strict會拋出異常。如果dynamic為true的話君珠,es會自動根據字段的值推測出來類型進而確定mapping寝志。
動態(tài)模板
通過 dynamic_templates,可以擁有對新字段的動態(tài)映射規(guī)則擁有完全的控制〔牟浚可以設置根據字段名稱或者類型來使用一個不同的映射規(guī)則毫缆。
每個模板都有一個名字,可以用來描述這個模板做了什么乐导。同時它有一個 mapping 用來指定具體的映射信息苦丁,和至少一個參數(比如 match)用來規(guī)定對于什么字段需要使用該模板。
模板的匹配是有順序的 - 第一個匹配的模板會被使用兽叮。
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地址、主機名规丽、狀態(tài)碼和標簽箕般。如果字段需要進行過濾第队、排序兵迅、聚合甜紫,則需要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·
# 創(chuàng)建一個索引霜大,指定當中一個域的數據類型
$ curl -H "Content-Type:application/json" -XPUT 'http://localhost:9200/my_index3' -d '{"mappings":{"properties":{"name":{"type":"text"}}}}'
Elasticsearch狀態(tài)查詢
Rest API | 說明 |
---|---|
/_cat/allocation | 查詢磁盤存儲信息 |
/_cat/shards | 查詢索引分片信息 |
/_cat/shards/{index} | 查詢某個索引的分片信息 |
/_cat/master | 查詢master節(jié)點信息 |
/_cat/nodes | 查詢集群節(jié)點信息 |
/_cat/tasks | 查詢任務信息 |
/_cat/indices | 查詢索引信息 |
/_cat/indices/{index} | 查詢某個具體索引的信息 |
/_cat/segments | 查詢段信息 |
/_cat/segments/{index} | 查詢段中的某個索引信息 |
/_cat/count | 查詢群集的文檔數 |
/_cat/count/{index} | 查詢群集中單個索引的文檔數 |
/_cat/recovery | 查詢索引分片恢復的視圖,包括正在進行和先前已完成的恢復革答。只要索引分片移動到群集中的其他節(jié)點战坤,就會發(fā)生恢復事件。在快照恢復残拐,復制級別更改途茫,節(jié)點故障或節(jié)點啟動期間可能會發(fā)生這種情況。 |
/_cat/pending_tasks | 查詢等待中的任務 |
/_cat/aliases | 查詢索引的當前配置別名的信息溪食,包括過濾器和路由信息 |
/_cat/aliases/{alias} | 查詢索引的當前配置別名的信息囊卜,包括過濾器和路由信息 |
/_cat/thread_pool | 查詢每個節(jié)點的群集范圍線程池統(tǒng)計信息。默認情況下错沃,為所有線程池返回活動栅组,隊列和拒絕的統(tǒng)計信息。 |
/_cat/plugins | 查詢運行插件的每個節(jié)點的視圖 |
/_cat/fielddata | 查詢集群中每個數據節(jié)點上fielddata當前正在使用的堆內存量 |
/_cat/nodeattrs | 查詢自定義節(jié)點屬性 |
/_cat/repositories | 查詢群集中注冊的快照存儲庫 |
/_cat/templates | 查詢現有模板的信息 |
e·g·
# 集群健康
$ curl -XGET http://localhost:9200/_cat/nodes?v
# 查詢現有模板的信息
$ curl -XGET 'http://localhost:9200/_cat/templates'