ES常用语法

概述

最近在使用es进行存储数据,可以说对es有了一个简单的了解,但是也遇到了很多问题。es mapping字段选择的问题,查询语法如何使用等等。。这里就先介绍下es的一些简单常用的查询语法,方便平时复习和查询。

ES常用语法

1. 集群管理:
  1. 快速检查集群的健康状况
    es提供了一套api,叫做cat api 可以查看es中的各种数据
[hadoop@hadoop ~]$ curl -get http://hadoop:9200/_cat/health?v
epoch      timestamp cluster        status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1566912000 21:20:00  my-application yellow 

如何让快速了解集群的健康状态? 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. 如何查看集群中有哪些索引
[hadoop@hadoop ~]$ curl -get http://hadoop:9200/_cat/indices?v
health status index      uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   ecommerce  Jt8sSxp6Qt2hSL0F39FdiQ   5   1          1            0        6kb            6kb
yellow open   test_index uZnzDfthQ7af4b0LMgoEGA   5   1          0            0       650b           650b
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

{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "gaolujie yagao",
"desc": "gaolujie meibai",
"price": 30,
"producer": "gaolujie producer",
"tags": [
"meibai"
,
"fangzhu"
]
}
}
  1. 修改商品:替换文档
PUT /ecommerce/product/1
{
"name": "shengjiban gaolujie yagao",
"desc": "gaolujie meibai",
"price": 30,
"producer": "gaolujie producer",
"tags":["meibai","fangzhu","qingxin"]
}
-------
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"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

你可能感兴趣的:(Elasticsearch,elasticsearch,elasticsearch查询)