es對索引的一堆操作都是用restful api去進行的,參數(shù)時一堆json讯嫂,一年前邊查邊寫搞過一次,這回搞遷移兆沙,發(fā)現(xiàn)es都到6.0版本了欧芽,也變化了很多,寫個小筆記記錄一下葛圃。
創(chuàng)建一個es索引很簡單千扔,一個put請求。
PUT /my_index
{
"settings": { ... any settings ... },
"mappings": {
"type_one": { ... any mappings ... },
},
"aliases" : {...}
}
新建一個索引库正,包含settings mappings 和aliases昏鹃。settings設(shè)置分片等一些參數(shù),mappings設(shè)置如何處理索引的各個type诀诊,aliases以前沒有用過洞渤,看上去我不太會用到,這邊就不記錄了属瓣。
settings
這邊有非常多的參數(shù)可以設(shè)置载迄,不過官方是不建議修改的。常見需要改的就倆
- number_of_shards
每個索引的主分片數(shù)抡蛙,默認值是 5 护昧。這個配置在索引創(chuàng)建后不能修改。 - number_of_replicas
每個主分片的副本數(shù)粗截,默認值是 1 惋耙。對于活動的索引庫,這個配置可以隨時修改熊昌。
PUT /my_temp_index
{
"settings": {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
給索引設(shè)置settings值
PUT /my_temp_index/_settings
{
"number_of_replicas": 1
}
修改settings值
mappings
每個文檔都有type绽榛,每種type都會有自己的mapping。mapping定義了type的field婿屹,每個field的數(shù)據(jù)類型灭美,以及es如何處理這些field。
注意昂利,一個mappings里邊不建議有多個type届腐,而且在es6之后的版本很有可能會不允許有多個type。
按照官方的計劃蜂奸,es7-es9會逐步去掉type
建議是每個index都只有一個type犁苏,原因是一個index中的各個type的字段并不是完全獨立的,一個index中多個type會造成一些浪費扩所。
可以通過/_mapping 來查看es中一個或多個索引中的一個或多個mapping围详。
數(shù)據(jù)類型 (field)
- 字符串 string
- text
- keyword
- 數(shù)字
- 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>動態(tài)映射</b>短曾,通過JSON中基本數(shù)據(jù)類型寒砖,嘗試猜測field類型
一般情況下,默認映射就足夠了嫉拐。es會自動把如 123 映射為integer哩都,123.123映射為double,但是很多情況下婉徘,我們都需要自定義映射漠嵌,特別是string類型。
自定義映射可以做這些事:
- 配置為全文字符串和精確字符串 (如name字段我更希望他不要分詞盖呼,而desc字段更需要分詞后搜索)
- 使用特定語言分析器
- 儒鹿。。几晤。
一個field最主要的屬性是type约炎,對于大部分field,一般只需要設(shè)置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,現(xiàn)在分為了兩種狮荔,keyword和text
text
text會先經(jīng)過分析器,然后索引起來狸捕,類似desc這樣的字段就需要使用text。有以下幾個重要字段众雷。
analyzer
分析器灸拍,可以指定如何處理這個string,比如我想先把所有html的標記全去掉砾省,再分詞鸡岗,再刪除無用的停頓次,然后把剩下的token索引起來纯蛾∠朔浚可以使用默認的standard分析器,也可以指定別的內(nèi)置的分析器翻诉。也可以使用插件安裝的第三份分析器,如ik捌刮,也可以自定義分析器碰煌。
分析器使用起來很簡單
{
"desc": {
"type": "string",
"analyzer": "ik_smart"
}
}
其中,ik_smart是已經(jīng)安裝好的第三方分析器绅作。
index
是否設(shè)置為可以搜索芦圾,boolean
norm
我理解是算分時是否進行一些標準化處理,需要額外的資源俄认。
fields
這個字段很有趣.. 先看個例子
"filename":{
"type":"text",
"norms":false,
"fields":{
"raw":{
"type":"keyword",
"ignore_above":256
}
}
},
一個filename的字段个少,這邊設(shè)置的是type是text洪乍,會分詞搜索。但有時候我們需要精準匹配夜焦,就可以使用filename.raw壳澳。插入時只需要輸入filename,保存在es里邊的會有兩份茫经,filename和filename.raw巷波。
keyword
和text不同,keyword不會經(jīng)過分析器卸伞,搜索時會精確匹配抹镊。
index fields
這兩個參數(shù)和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設(shè)置為日志垮耳,name字段精確索引,user_id設(shè)置為long型遂黍。
更新映射
PUT /index_name/_mapping/person
{
"properties" : {
"tag" : {
"type" : "string",
"index": "not_analyzed"
}
}
}
新增一個tag字段终佛。