西藏建設(shè)廳網(wǎng)站首頁(yè)seo科技網(wǎng)
ElasticSearch入門到實(shí)戰(zhàn)教程:點(diǎn)擊查看
1. 對(duì)象類型(object)
一個(gè)字段下需要多種類型的屬性字段,屬性 attr
有身高、體重,添加映射語(yǔ)句如下:
POST indexname/_mapping
{"properties": {"attr": {"properties": {"height": {"type": "double"},"weight": {"type": "double"}}}}
}
對(duì)象類型新增數(shù)據(jù)語(yǔ)法
PUT indexname/_doc/1
{"attr": {"height": 176.3,"weight": 64}
}
篩選查詢新增的數(shù)據(jù)
GET indexname/_search
{"query":{"term":{"attr.weight": "64"}}
}
2. 數(shù)組類型
ELasticsearch沒(méi)有專用的數(shù)組類型,默認(rèn)情況下任何字段都可以包含一個(gè)或者多個(gè)值,但是一個(gè)數(shù)組中的值要是同一種類型。
- 字符數(shù)組: [ “one”, “two” ]
- 整型數(shù)組:[1,3]
- 對(duì)象數(shù)組:[ { “name”: “長(zhǎng)度”, “value”: “10” }, { “name”: “內(nèi)存”, “value”: “16” }]
keyword數(shù)組,創(chuàng)建keyword字段
POST indexname/_mapping
{"properties": {"skills": {"type": "keyword"}}
}
新增數(shù)據(jù)
PUT indexname/_doc/2
{"skills": ["java", "c++"]
}
對(duì)象數(shù)組,創(chuàng)建對(duì)象字段
POST indexname/_mapping
{"properties": {"attrs": {"properties": {"name": {"type": "keyword"},"value": {"type": "keyword"}}}}
}
新增數(shù)據(jù)
PUT indexname/_doc/3
{"attrs": [{"name": "長(zhǎng)度","value": "10"},{"name": "內(nèi)存","value": "16"}]
}
3. 嵌套文檔(nested)
nested嵌套類型是object中的一個(gè)特例,可以讓對(duì)象數(shù)組
類型獨(dú)立索引和查詢。
項(xiàng)目場(chǎng)景中彌補(bǔ)對(duì)象數(shù)組的一些查詢問(wèn)題
接著前面創(chuàng)建的對(duì)象數(shù)組 attrs
先添加幾條數(shù)據(jù)
POST _bulk
{"create":{"_index":"indexname","_id":20}}
{"attrs":[{"name":"長(zhǎng)度","value":"64"},{"name":"內(nèi)存","value":"32"}]}
{"create":{"_index":"indexname","_id":21}}
{"attrs":[{"name":"長(zhǎng)度","value":"64"},{"name":"內(nèi)存","value":"64"}]}
{"create":{"_index":"indexname","_id":22}}
{"attrs":[{"name":"長(zhǎng)度","value":"64"}]}
現(xiàn)在業(yè)務(wù)需求:需要 屬性=長(zhǎng)度 且 值=32
的數(shù)據(jù)(目前數(shù)據(jù)里沒(méi)有),我們來(lái)寫查詢語(yǔ)法。
GET indexname/_search
{"query": {"bool": {"must": [{"term": {"attrs.name": "長(zhǎng)度"}},{"term": {"attrs.value": "32"}}]}}
}
運(yùn)行后發(fā)現(xiàn)居然有數(shù)據(jù),為什么呢?我們后面原理篇會(huì)講。
怎么解決這種問(wèn)題呢?使用
nested
類型即可解決。
添加映射字段
POST indexname/_mapping
{"properties": {"attrsNested": {"type": "nested","properties": {"name": {"type": "keyword"},"value": {"type": "keyword"}}}}
}
添加幾條數(shù)據(jù)
POST _bulk
{"create":{"_index":"indexname","_id":20}}
{"attrsNested":[{"name":"長(zhǎng)度","value":"64"},{"name":"內(nèi)存","value":"32"}]}
{"create":{"_index":"indexname","_id":21}}
{"attrsNested":[{"name":"長(zhǎng)度","value":"64"},{"name":"內(nèi)存","value":"64"}]}
{"create":{"_index":"indexname","_id":22}}
{"attrsNested":[{"name":"長(zhǎng)度","value":"64"}]}
查詢數(shù)據(jù)
GET indexname/_search
{"query": {"nested": {"path": "attrsNested","query": {"bool": {"must": [{"term": {"attrsNested.name": "長(zhǎng)度"}},{"term": {"attrsNested.value": "32"}}]}}}}
}
已經(jīng)查不到數(shù)據(jù)了,問(wèn)題完美解決
4. 子字段
text
類型不能用于排序、聚合。為什么呢?因?yàn)樗膶傩?fielddata
默認(rèn)是false,設(shè)置為true就可以了,但是不建議使用,會(huì)增加內(nèi)存的壓力。
添加字段映射(不建議設(shè)置true):
POST indexname/_mapping
{"properties": {"address": {"type": "text","fielddata":true}}
}
直接使用 keyword
類型可以進(jìn)行排序、聚合。
想必會(huì)有同學(xué)有疑問(wèn):
同樣是字符串類型,干脆直接都用keyword類型不就行了。
如果你不需要 分詞
那么你用keyword完全可以,如果你需要對(duì)字段值分詞,那你還是需要用text。
那么有沒(méi)有不增加壓力,而且不用兩個(gè)字段的方法呢? 當(dāng)然有,就是做子字段!
POST indexname/_mapping
{"properties": {"address": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}
}
address
字段下增加了 keyword
名字的字段,類型是 keyword
,設(shè)置256長(zhǎng)度
對(duì)應(yīng)查詢子字段keyword
的語(yǔ)句
GET indexname/_search
{"query": {"term":{"address.keyword": ""}}
}
5. 地理類型
geo_point
是地理類型。移動(dòng)互聯(lián)網(wǎng)的時(shí)代,移動(dòng)設(shè)備越來(lái)越多,要根據(jù)地理位置搜索地址,可以把地址的經(jīng)緯度數(shù)據(jù)設(shè)置地理數(shù)據(jù)類型。
POST indexname/_mapping
{"properties": {"location": {"type": "geo_point"}}
}
添加一條地理位置數(shù)據(jù)
PUT indexname/_doc/6
{"location": {"lat": 41.07,"lon": 116.64}
}
- lat(經(jīng)度)
- lon(緯度)
根據(jù)(41.07,116.14)坐標(biāo),查詢100km內(nèi)的位置信息
GET indexname/_search
{"query": {"geo_distance": {"distance": "100km","location": {"lat": 41.07,"lon": 116.14}}}
}
根據(jù)(23.6,32.2)位置,對(duì)查詢結(jié)果進(jìn)行遠(yuǎn)近排序
GET indexname/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance": {"location": "23.6,32.2","unit": "km"}}]
}
更多資料請(qǐng)看《ElasticSearch入門到實(shí)戰(zhàn)教程》:點(diǎn)擊查看