概述
最近在使用es進行存儲數據,可以說對es有了一個簡單的瞭解,但是也遇到了很多問題。es mapping字段選擇的問題,查詢語法如何使用等等。。這裏就先介紹下es的一些簡單常用的查詢語法,方便平時複習和查詢。
ES常用語法
1. 集羣管理:
- 快速檢查集羣的健康狀況
es提供了一套api,叫做cat api 可以查看es中的各種數據
GET / _cat/health?v
如何讓快速瞭解集羣的健康狀態? green,yellow,red
green:每個索引的primary shard 和replica shard 都是active狀態的
yellow:每個索引的primary shard都是active,但是部分的replica shard不是active 狀態,處於不可用狀態
red:不是所有的索引的primary shard都是active,部分索引數據有丟失。
注意:
如果電腦只有一個節點,啓動es進程就只有一個node,如果創建一個index,默認會給這個index分配5個primary shard 和5個replica shard,而且primary shard 和 replica shard不能在同一個節點上,所以只有一個primary shard
被分配,但是一個replica shard沒有第二臺機器去啓動所以會處於yellow狀態。
2. 如何查看集羣中有哪些索引
GET /_cat/indices?vi
3. 簡單的索引操作
創建索引:PUT /test_index?pretty
刪除索引:DELETE /test_index?pretty
4. CURD操作
- 新增商品:新增文檔,建立索引
PUT /index/type/id
PUT /ecommerce/product/1
{
"name": "gaolujie yagao",
"desc": "gaolujie meibai",
"price": 30,
"producer": "gaolujie producer",
"tags":["meibai","fangzhu"]
}
PUT /ecommerce/product/2
{
"name": "jiajieshi yagao",
"desc": "meibai",
"price": 25,
"producer": "jiajieshi producer",
"tags":["meibai"]
}
PUT /ecommerce/product/3
{
"name": "c yagao",
"desc": "caoben zhiwu",
"price": 40,
"producer": "zhonghua producer",
"tags":["qingxin"]
}
注意: es會自動建立index和type,不需要提前創建,而且es會默認對document的每個field建立倒排索引,可以被檢索
- 查新商品:索引文檔
GET /ecommerce/product/1
- 修改商品:替換文檔
PUT /ecommerce/product/1
{
"name": "shengjiban gaolujie yagao",
"desc": "gaolujie meibai",
"price": 30,
"producer": "gaolujie producer",
"tags":["meibai","fangzhu","qingxin"]
}
注意:這種方式不是很好,必須帶上所有的field,才能進行信息的修改
- 修改商品:更新文檔
POST /ecommerce/product/1/_update
{
"name":"shengjiban gaolujie yagao"
}
- 刪除:刪除文檔
DELETE /ecommerce/product/1?pretty
5.es搜索方式
- query string search
GET /ecmomerce/pruduct/_search
took:耗費幾毫秒
time_out:時候是否超時
_shards:數據拆分成5個分片所以對於搜索請求,會打到所有的primary shard
(或者relica shard)
hits.total:查詢結果 多少個document
hits.max_score:score的含義就是document對於一個search的相關度的匹配分數,
越相關,分數越高,越匹配
hits.hits:包含了匹配搜索的document詳細數據
- 需求:搜索商品名稱中包含yagao的商品,而且安裝售價降序排序:
GET /ecommerce/product/_search?q=name:yagao&sort=price:desc
(該種方式瞭解即可,生產環境基本不會用到,用起來不方便url太長)
- query DSL(Domain Specified Laguage:特定領域的語言)
請求條件放在body中以json 的格式
GET /ecmomerce/pruduct/_search
{
"query":{"match_all:0"}
}
- 查詢名稱包含牙膏的商品,同時按照價格降序排序
GET /ecmomerce/pruduct/_search
{
"query":{
"match":{
"name":"yagao"
}
},
"sort":[
{"price":"desc"}
]
}
- 分頁查詢從from(1)個商品開始查,查詢size(2)個
GET /ecmomerce/pruduct/_search
{
"query":{"match_all":0},
"from":1,
"size":2
}
GET /ecmomerce/pruduct/_search
{
"query":{"match_all":0},
"_source":["name","price"]
}
(常用)
- query filter
- 搜索商品名稱包含牙膏,且售價大於25元的商品
GEt /ecmomerce/pruduct/_search
{
"query":{
"bool":{
"must":{
"name":"yagao"
}
},
"filter":{
"range":{
"price":{"gt":25}
}
}
}
}
- full-text search
GET /ecommerce/product/_search
{
"query":{
"match":{
"priduce":"yagao producer"
}
}
}
yagao produce 會拆兩個單詞進行匹配
- phrase search(短語搜索)
GET /ecmomerce/pruduct/_search
{
"query":{
"match_phrase":{
"produce":"yagao producer"
}
}
}
跟全文搜索相對應,相反,全文搜素會將輸入的搜索串拆解開來,去倒排索引進行匹配,只要能匹配上任意一個拆解的單詞就可以作爲返回結果
phrase search,要求輸入的搜索串,必須在指定的字段文本中,完全包含一模一樣的纔可以匹配成功,進行返回。
- highlight search(高亮搜索)
GET /ecmomerce/pruduct/_search
{
"query":{
"match":{
"producer":"producer"
}
},
"highlight":{
"fields":{
"producer":{}
}
}
}
聚合
- 計算每個tag下的商品數量
GET /ecmomerce/pruduct/_search
{
"aggs":{
"group_by_tags":{
"term":{"field":"tags"}}
}
}
}
將本文field 的fielddata屬性設置爲true
PUT /ecommerce/_mapping/product
{
"properties":{
"tags":{
"type":"text",
"fielddata":true
}
}
}
- 需求:對名稱中包含yagao的商品,計算每個tag下的商品數量
GET /ecmomerce/pruduct/_search
{
"size":0,
"query":{
"match":{
"name":"yagao"
}
},
"aggs":{
"group_by_tags":{
"term":{"field":"tags"}}
}
}
}
- 需求:先分組,在計算分組的平均值,計算每個tag下的商品的平均價格
GET /ecmomerce/pruduct/_search
{
"size":0,
"aggs":{
"group_by_tags":{
"terms":{"filed":"tags"},
"aggs":{
"avg_price":{
"avg":{"field":"price"}
}
}
}
}
}
GET /ecmomerce/pruduct/_search
{
"size":0
"aggs":{
"all_tags":{
"terms":{"field":"tags","order":{"avg_price":"desc"}},
"aggs":{
"avg_price":{
"avg":{"field":"price "}
}
}
}
}
}
- 需求:按照指定的價格範圍區間進行分組,然後在分組內再按照tag進行分組。最後計算每組的平均價格
GET /ecmomerce/pruduct/_search
{
"size":0,
"aggs":{
"group_by_price":{
"range":{
"field":"price",
"ranges":[
{
"from":0,
"to",20
},
{
"from":20,
"to",40
},
{
"from":40,
"to",50
}
]
},
"aggs"{
"group_by_tags":{
"terms":{
"field":"tags"
},
"aggs":{
"average_price":{
"avg":{
"field":"price"
}
}
}
}
}
}
}
}
//TODO