ES常用語法

概述

最近在使用es進行存儲數據,可以說對es有了一個簡單的瞭解,但是也遇到了很多問題。es mapping字段選擇的問題,查詢語法如何使用等等。。這裏就先介紹下es的一些簡單常用的查詢語法,方便平時複習和查詢。

ES常用語法

1. 集羣管理:
  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操作
  1. 新增商品:新增文檔,建立索引
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建立倒排索引,可以被檢索

  1. 查新商品:索引文檔
GET /ecommerce/product/1
  1. 修改商品:替換文檔
PUT /ecommerce/product/1
{
"name": "shengjiban gaolujie yagao",
"desc": "gaolujie meibai",
"price": 30,
"producer": "gaolujie producer",
"tags":["meibai","fangzhu","qingxin"]
}

注意:這種方式不是很好,必須帶上所有的field,才能進行信息的修改

  1. 修改商品:更新文檔
POST /ecommerce/product/1/_update
{
"name":"shengjiban gaolujie yagao"
}
  1. 刪除:刪除文檔
DELETE /ecommerce/product/1?pretty
5.es搜索方式
  1. 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太長)

  1. 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"]
}
(常用)
  1. query filter
  • 搜索商品名稱包含牙膏,且售價大於25元的商品
GEt /ecmomerce/pruduct/_search
{
   "query":{
       "bool":{
	      "must":{
		      "name":"yagao" 
		   }
	    },
	       "filter":{
		      "range":{
			     "price":{"gt":25}
			  }
		   }
    }
}
  1. full-text search
GET /ecommerce/product/_search
{
  "query":{
     "match":{
	    "priduce":"yagao producer"
	 }
  }
}

yagao produce 會拆兩個單詞進行匹配

  1. phrase search(短語搜索)
GET /ecmomerce/pruduct/_search
{
   "query":{
       "match_phrase":{
	       "produce":"yagao producer"
	   }
    }
}

跟全文搜索相對應,相反,全文搜素會將輸入的搜索串拆解開來,去倒排索引進行匹配,只要能匹配上任意一個拆解的單詞就可以作爲返回結果
phrase search,要求輸入的搜索串,必須在指定的字段文本中,完全包含一模一樣的纔可以匹配成功,進行返回。

  1. highlight search(高亮搜索)
GET /ecmomerce/pruduct/_search
{
    "query":{
     "match":{
	    "producer":"producer"
	  }
    },
	"highlight":{
	      "fields":{
		     "producer":{}
		}
	}
}
聚合
  1. 計算每個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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章