es對索引的一堆操作都是用restful api去進行的,參數時一堆json,一年前邊查邊寫搞過一次,這回搞遷移,發現es都到6.0版本了,也變化了很多,寫個小筆記記錄一下。
創建一個es索引很簡單,一個put請求。
PUT /my_index
{
"settings": { ... any settings ... }, "mappings": { "type_one": { ... any mappings ... }, }, "aliases" : {...} }
新建一個索引,包含settings mappings 和aliases。settings設置分片等一些參數,mappings設置如何處理索引的各個type,aliases以前沒有用過,看上去我不太會用到,這邊就不記錄了。
settings
這邊有非常多的參數可以設置,不過官方是不建議修改的。常見需要改的就倆
- number_of_shards
每個索引的主分片數,默認值是 5 。這個配置在索引創建后不能修改。 - number_of_replicas
每個主分片的副本數,默認值是 1 。對於活動的索引庫,這個配置可以隨時修改。
PUT /my_temp_index
{
"settings": { "number_of_shards" : 3, "number_of_replicas" : 2 } }
給索引設置settings值
PUT /my_temp_index/_settings
{
"number_of_replicas": 1 }
修改settings值
mappings
每個文檔都有type,每種type都會有自己的mapping。mapping定義了type的field,每個field的數據類型,以及es如何處理這些field。
注意,一個mappings里邊不建議有多個type,而且在es6之后的版本很有可能會不允許有多個type。
按照官方的計划,es7-es9會逐步去掉type
建議是每個index都只有一個type,原因是一個index中的各個type的字段並不是完全獨立的,一個index中多個type會造成一些浪費。
可以通過/_mapping 來查看es中一個或多個索引中的一個或多個mapping。
數據類型 (field)
- 字符串 string
- text
- keyword
- 數字
- long integer short byte double float half_float scaled_float
- 布爾型 boolean
- 日期 date
- range
- integer_range
- float_range
- long_range
- double_range
- date_range
- array
- object
還有很多我確定我不會用到的類型。
當索引一個包含新的field的文檔時,es會使用<b>動態映射</b>,通過JSON中基本數據類型,嘗試猜測field類型
一般情況下,默認映射就足夠了。es會自動把如 123 映射為integer,123.123映射為double,但是很多情況下,我們都需要自定義映射,特別是string類型。
自定義映射可以做這些事:
- 配置為全文字符串和精確字符串 (如name字段我更希望他不要分詞,而desc字段更需要分詞后搜索)
- 使用特定語言分析器
- 。。。
一個field最主要的屬性是type,對於大部分field,一般只需要設置type就可以了:
{
"number_of_clicks": { "type": "integer" } }
range
PUT range_index
{
"mappings": { "my_type": { "properties": { "expected_attendees": { "type": "integer_range" }, "time_frame": { "type": "date_range", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } } }
插入格式
PUT range_index/my_type/1
{
"expected_attendees" : { "gte" : 10, "lte" : 20 }, "time_frame" : { "gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01" } }
搜索格式
POST range_index/_search
{
"query" : { "range" : { "time_frame" : { "gte" : "2015-10-31", "lte" : "2015-11-01", "relation" : "within" } } } }
這部分比較簡單 不細致展開了
string
對於string類型,以前是只有string,現在分為了兩種,keyword和text
text
text會先經過分析器,然后索引起來,類似desc這樣的字段就需要使用text。有以下幾個重要字段。
analyzer
分析器,可以指定如何處理這個string,比如我想先把所有html的標記全去掉,再分詞,再刪除無用的停頓次,然后把剩下的token索引起來。可以使用默認的standard分析器,也可以指定別的內置的分析器。也可以使用插件安裝的第三份分析器,如ik,也可以自定義分析器。
分析器使用起來很簡單
{
"desc": { "type": "string", "analyzer": "ik_smart" } }
其中,ik_smart是已經安裝好的第三方分析器。
index
是否設置為可以搜索,boolean
norm
我理解是算分時是否進行一些標准化處理,需要額外的資源。
fields
這個字段很有趣.. 先看個例子
"filename":{ "type":"text", "norms":false, "fields":{ "raw":{ "type":"keyword", "ignore_above":256 } } },
一個filename的字段,這邊設置的是type是text,會分詞搜索。但有時候我們需要精准匹配,就可以使用filename.raw。插入時只需要輸入filename,保存在es里邊的會有兩份,filename和filename.raw。
keyword
和text不同,keyword不會經過分析器,搜索時會精確匹配。
index fields
這兩個參數和text的相同
ignore_above
丟掉超過一定長度的字符串
映射操作
新建映射
PUT /index_name
{
"mappings": { "person" : { "properties" : { "desc" : { "type" : "string", "analyzer": "ik_smart" }, "birth" : { "type" : "date" }, "name" : { "type" : "string", "index" : "not_analyzed" }, "user_id" : { "type" : "long" } } } } }
新建一個index,desc字段用ik分詞索引,birth設置為日志,name字段精確索引,user_id設置為long型。
更新映射
PUT /index_name/_mapping/person
{
"properties" : { "tag" : { "type" : "string", "index": "not_analyzed" } } }
新增一個tag字段。
作者:辰辰沉沉沉
鏈接:https://www.jianshu.com/p/bd23b86848dd
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。