es之增删改查
Posted wan了个蛋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es之增删改查相关的知识,希望对你有一定的参考价值。
查询
index:
GET task_results/_search/
普通查询:
"query":
"bool":
"must": [
"match": "task_id": "1363bb4a03e0ee456345edc70b381f04e01064a42773576e3fe8810b0fd9df42"
]
json嵌套查询:
"query":
"nested":
"path":"cloud_result",
"query":
"bool":
"must":[
"match":"cloud_result.label":113718644
]
range 查询:
"from":0,
"size":10,
"query":
"nested":
"path":"cloud_result",
"query":
"bool":
"must":[
"match":"cloud_result.label":113718644,
"range":"cloud_result.confidence":"gte":0.8
]
同时查询多个值,类型mysql中的in:
"query":
"bool": "must": [
"match":
"project_id": "1"
,
"terms":
"incident_type":[1,2]
]
排序:
"from":0,
"size":10,
"query":
"nested":
"path":"cloud_result",
"query":
"bool":
"must":[
"match":"cloud_result.label":113718644,
"range":"cloud_result.confidence":"gte":0.8
]
,
"sort":"create_at":"order":"desc"
json嵌套+普通字段查询:
"query":
"bool" :
"must" : [
"nested" : "path" : "cloud_result",
"query" :
"term" : "cloud_result.label" :113718644 ,
"term" : "project_id" : 29
]
match和term查询的区别
match
- match的查询词会被分词
- match_phrase 不会分词
- match_phrase 可对多个字段进行匹配
term
- term代表完全匹配,不进行分词器分析
- term 查询的字段需要在mapping的时候定义好,否则可能词被分词。传入指定的字符串,查不到数据
bool联合查询
- must should must_not
- must 完全匹配
- should 至少满足一个
- must_not不匹配
es聚合查询:
https://blog.csdn.net/qq_43588909/article/details/126381390
根据project_id分组:
"size": 0,
"aggs":
"aggs.demo01":
"terms":
"field": "project_id",
"size": 10,
"order":
"_count": "asc" // 根据统计条数升序,desc降序
聚合后having:
"size": 0,
"aggs":
"groupName":
"terms":
"field": "source"
,
"aggs":
"countSource":
"terms":
"field": "source"
, "order":
"_count": "asc"
,
"having":
"bucket_selector":
"buckets_path":
"orderCount": "_count"
,
"script":
"source": "params.orderCount >1 "
基于查询结果聚合: 查询project_id=12 and cloud_result.label=694547 group source
"size": 0,
"query":
"bool": "must":
[
"nested":
"path": "cloud_result",
"query":
"match":"cloud_result.label" :694547,
]
,
"aggs":
"groupName":
"terms":
"field": "source"
,
"aggs":
"countSource":
"terms":
"field": "source"
, "order":
"_count": "asc"
,
"having":
"bucket_selector":
"buckets_path":
"orderCount": "_count"
,
"script":
"source": "params.orderCount >1 "
聚合后查询:
"query":
"range":
"Price":
"gte": 50,
"lte": 500
,
"aggs":
"tags_bucket":
"terms":
"field": "Tags.keyword"
,
"post_filter":
"term":
"Tags.keyword": "营养"
更新
1.覆盖式更新(会把旧数据替换掉)
PUT student-001/_doc/1?refresh=true
"id": 1,
"name": "student-1",
"year": 1
2.部分更新
把 id 为1的数据的 name 字段更新
POST student-001/_update/1?refresh=true
"doc":
"name": "student-123"
如果数据不存在,则作为新数据添加;如果数据已经存在,则更新旧数据,那么我们可以添加参数 doc_as_upsert
POST student-001/_update/1?refresh=true
"doc":
"name": "student-23"
,
"doc_as_upsert": true
使用脚本的方式来更新数据
POST student-001/_update/1?refresh=true
"script":
"source": "ctx._source.name=\'student-1\'"
新增
批量添加数据:
PUT _bulk
"index":"_index":"student-001","_id":1
"id": 1,"name": "student-1","year": 1
"index":"_index":"student-001","_id":2
"id": 2,"name": "student-2","year": 2
"index":"_index":"student-001","_id":3
"id": 3,"name": "student-3","year": 3
"index":"_index":"student-001","_id":4
"id": 4,"name": "student-4","year": 1
"index":"_index":"student-001","_id":5
删除
根据查询条件删除:
POST task_results/_delete_by_query
"query":
"bool": "must": [
"match": "project_id": 12,
"match":
"organization_id": "maint"
]
Elasticsearch入门之增删改查进阶
1、条件查询 & 分页查询 & 查询排序
1.1、条件查询
假设有以下文档内容,(在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search
{ "took": 5, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 } }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BNR5sHgBaKNfVnMb7pal", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BtR6sHgBaKNfVnMbX5Y5", "_score": 1, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "B9R6sHgBaKNfVnMbZpZ6", "_score": 1, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "CdR7sHgBaKNfVnMbsJb9", "_score": 1, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } } ] } }
1.2、URL带参查询
查找category为小米的文档,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search?q=category:小米,返回结果如下:
{ "took": 94, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1.3862942, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 1.3862942, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 } }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": 1.3862942, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BNR5sHgBaKNfVnMb7pal", "_score": 1.3862942, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } } ] } }
上述为URL带参数形式查询,这很容易让不善者心怀恶意,或者参数值出现中文会出现乱码情况。为了避免这些情况,我们可用使用带JSON请求体请求进行查询。
1.3、请求体带参查询接下带JSON请求体,还是查找category为小米的文档,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "match":{ "category":"小米" } } }
返回结果如下:
{ "took": 3, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1.3862942, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 1.3862942, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 } }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": 1.3862942, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BNR5sHgBaKNfVnMb7pal", "_score": 1.3862942, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } } ] } }
1.4、带请求体方式的查找所有内容查找所有文档内容,也可以这样,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "match_all":{} } }
则返回所有文档内容:
{ "took": 2, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 } }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BNR5sHgBaKNfVnMb7pal", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BtR6sHgBaKNfVnMbX5Y5", "_score": 1, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "B9R6sHgBaKNfVnMbZpZ6", "_score": 1, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "CdR7sHgBaKNfVnMbsJb9", "_score": 1, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } } ] } }
1.5、查询指定字段
如果你想查询指定字段,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "match_all":{} }, "_source":["title"] }
返回结果如下:
{ "took": 5, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 1, "_source": { "title": "小米手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": 1, "_source": { "title": "小米手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "BNR5sHgBaKNfVnMb7pal", "_score": 1, "_source": { "title": "小米手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "BtR6sHgBaKNfVnMbX5Y5", "_score": 1, "_source": { "title": "华为手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "B9R6sHgBaKNfVnMbZpZ6", "_score": 1, "_source": { "title": "华为手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "CdR7sHgBaKNfVnMbsJb9", "_score": 1, "_source": { "title": "华为手机" } } ] } }
1.6、分页查询
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "match_all":{} }, "from":0, "size":2 }
返回结果如下:
{ "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 } }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } } ] } }
1.7、查询排序
如果你想通过排序查出价格最高的手机,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "match_all":{} }, "sort":{ "price":{ "order":"desc" } } }
返回结果如下:
{ "took": 96, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": null, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": null, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 }, "sort": [ 3999 ] }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": null, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 }, "sort": [ 1999 ] }, { "_index": "shopping", "_type": "_doc", "_id": "BNR5sHgBaKNfVnMb7pal", "_score": null, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 }, "sort": [ 1999 ] }, { "_index": "shopping", "_type": "_doc", "_id": "BtR6sHgBaKNfVnMbX5Y5", "_score": null, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 }, "sort": [ 1999 ] }, { "_index": "shopping", "_type": "_doc", "_id": "B9R6sHgBaKNfVnMbZpZ6", "_score": null, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 }, "sort": [ 1999 ] }, { "_index": "shopping", "_type": "_doc", "_id": "CdR7sHgBaKNfVnMbsJb9", "_score": null, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 }, "sort": [ 1999 ] } ] } }
2、多条件查询 & 范围查询
2.1、多条件查询
假设想找出小米牌子,价格为3999元的。(must相当于数据库的&&)
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "bool":{ "must":[{ "match":{ "category":"小米" } },{ "match":{ "price":3999.00 } }] } } }
返回结果如下:
{ "took": 134, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 2.3862944, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 2.3862944, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 } } ] } }
假设想找出小米和华为的牌子,价格大于2000元的手机。(should相当于数据库的||)
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "bool":{ "should":[{ "match":{ "category":"小米" } },{ "match":{ "category":"华为" } }] }, "filter":{ "range":{ "price":{ "gt":2000 } } } } }
返回结果如下:
{ "took": 8, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": 1.3862942, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 1.3862942, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 } }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": 1.3862942, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BNR5sHgBaKNfVnMb7pal", "_score": 1.3862942, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BtR6sHgBaKNfVnMbX5Y5", "_score": 1.3862942, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "B9R6sHgBaKNfVnMbZpZ6", "_score": 1.3862942, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "CdR7sHgBaKNfVnMbsJb9", "_score": 1.3862942, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } } ] } }
3、全文检索 & 完全匹配 & 高亮查询
3.1、全文检索
这功能像搜索引擎那样,如品牌输入“小华”,返回结果带回品牌有“小米”和华为的。
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "match":{ "category" : "小华" } } }
返回结果如下:
{ "took": 7, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": 0.6931471, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 0.6931471, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 } }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": 0.6931471, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BNR5sHgBaKNfVnMb7pal", "_score": 0.6931471, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BtR6sHgBaKNfVnMbX5Y5", "_score": 0.6931471, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "B9R6sHgBaKNfVnMbZpZ6", "_score": 0.6931471, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "CdR7sHgBaKNfVnMbsJb9", "_score": 0.6931471, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } } ] } }
3.2、完全匹配
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "match_phrase":{ "category" : "为" } } }
返回结果如下:
{ "took": 2, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 0.6931471, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "BtR6sHgBaKNfVnMbX5Y5", "_score": 0.6931471, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "B9R6sHgBaKNfVnMbZpZ6", "_score": 0.6931471, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "CdR7sHgBaKNfVnMbsJb9", "_score": 0.6931471, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } } ] } }
3.3、高亮查询
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "query":{ "match_phrase":{ "category" : "为" } }, "highlight":{ "fields":{ "category":{}//<----高亮这字段 } } }
返回结果如下:
{ "took": 100, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 0.6931471, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "BtR6sHgBaKNfVnMbX5Y5", "_score": 0.6931471, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 }, "highlight": { "category": [ "华<em>为</em>"//<------高亮一个为字。 ] } }, { "_index": "shopping", "_type": "_doc", "_id": "B9R6sHgBaKNfVnMbZpZ6", "_score": 0.6931471, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 }, "highlight": { "category": [ "华<em>为</em>" ] } }, { "_index": "shopping", "_type": "_doc", "_id": "CdR7sHgBaKNfVnMbsJb9", "_score": 0.6931471, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 }, "highlight": { "category": [ "华<em>为</em>" ] } } ] } }
4、聚合查询
聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值max、平均值avg等等。
接下来按price字段进行分组:
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "aggs":{//聚合操作 "price_group":{//名称,随意起名 "terms":{//分组 "field":"price"//分组字段 } } } }
返回结果如下:
{ "took": 63, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "ANQqsHgBaKNfVnMbhZYU", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999 } }, { "_index": "shopping", "_type": "_doc", "_id": "A9R5sHgBaKNfVnMb25Ya", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BNR5sHgBaKNfVnMb7pal", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "BtR6sHgBaKNfVnMbX5Y5", "_score": 1, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "B9R6sHgBaKNfVnMbZpZ6", "_score": 1, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } }, { "_index": "shopping", "_type": "_doc", "_id": "CdR7sHgBaKNfVnMbsJb9", "_score": 1, "_source": { "title": "华为手机", "category": "华为", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 1999 } } ] }, "aggregations": { "price_group": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": 1999, "doc_count": 5 }, { "key": 3999, "doc_count": 1 } ] } } }
上面返回结果会附带原始数据的。若不想要不附带原始数据的结果,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "aggs":{ "price_group":{ "terms":{ "field":"price" } } }, "size":0 }
返回结果如下:
{ "took": 60, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": null, "hits": [] }, "aggregations": { "price_group": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": 1999, "doc_count": 5 }, { "key": 3999, "doc_count": 1 } ] } } }
若想对所有手机价格求平均值。
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{ "aggs":{ "price_avg":{//名称,随意起名 "avg":{//求平均 "field":"price" } } }, "size":0 }
返回结果如下:
{ "took": 14, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": null, "hits": [] }, "aggregations": { "price_avg": { "value": 2332.3333333333335 } } }
5、映射关系
有了索引库,等于有了数据库中的 database。
接下来就需要建索引库(index)中的映射了,类似于数据库(database)中的表结构(table)。
创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。
先创建一个索引:
# PUT http://127.0.0.1:9200/user
返回结果:
{ "acknowledged": true, "shards_acknowledged": true, "index": "user" }
创建映射
# PUT http://127.0.0.1:9200/user/_mapping { "properties": { "name":{ "type": "text", "index": true }, "sex":{ "type": "keyword", "index": true }, "tel":{ "type": "keyword", "index": false } } }
返回结果如下:
{ "acknowledged": true }
查询映射
#GET http://127.0.0.1:9200/user/_mapping
返回结果如下:
{ "user": { "mappings": { "properties": { "name": { "type": "text" }, "sex": { "type": "keyword" }, "tel": { "type": "keyword", "index": false } } } } }
增加数据
#PUT http://127.0.0.1:9200/user/_create/1001 { "name":"小米", "sex":"男的", "tel":"1111" }
返回结果如下:
{ "_index": "user", "_type": "_doc", "_id": "1001", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
查找name含有”小“数据:
#GET http://127.0.0.1:9200/user/_search { "query":{ "match":{ "name":"小" } } }
返回结果如下:
{ "took": 495, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 0.2876821, "hits": [ { "_index": "user", "_type": "_doc", "_id": "1001", "_score": 0.2876821, "_source": { "name": "小米", "sex": "男的", "tel": "1111" } } ] } }
查找sex含有”男“数据:
#GET http://127.0.0.1:9200/user/_search { "query":{ "match":{ "sex":"男" } } }
返回结果如下:
{ "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 0, "relation": "eq" }, "max_score": null, "hits": [] } }
找不想要的结果,只因创建映射时"sex"的类型为"keyword"。
"sex"只能完全为”男的“,才能得出原数据。
#GET http://127.0.0.1:9200/user/_search { "query":{ "match":{ "sex":"男的" } } }
返回结果如下:
{ "took": 2, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 0.2876821, "hits": [ { "_index": "user", "_type": "_doc", "_id": "1001", "_score": 0.2876821, "_source": { "name": "小米", "sex": "男的", "tel": "1111" } } ] } }
查询电话
# GET http://127.0.0.1:9200/user/_search { "query":{ "match":{ "tel":"11" } } }
返回结果如下:
{ "error": { "root_cause": [ { "type": "query_shard_exception", "reason": "failed to create query: Cannot search on field [tel] since it is not indexed.", "index_uuid": "ivLnMfQKROS7Skb2MTFOew", "index": "user" } ], "type": "search_phase_execution_exception", "reason": "all shards failed", "phase": "query", "grouped": true, "failed_shards": [ { "shard": 0, "index": "user", "node": "4P7dIRfXSbezE5JTiuylew", "reason": { "type": "query_shard_exception", "reason": "failed to create query: Cannot search on field [tel] since it is not indexed.", "index_uuid": "ivLnMfQKROS7Skb2MTFOew", "index": "user", "caused_by": { "type": "illegal_argument_exception", "reason": "Cannot search on field [tel] since it is not indexed." } } } ] }, "status": 400 }
报错只因创建映射时"tel"的"index"为false。
以上是关于es之增删改查的主要内容,如果未能解决你的问题,请参考以下文章