背景
本文总结ElasticSearch的一些常用命令和用法,会长期更新,希望对大家有所帮助。
常见操作
新建映射(mapping)
curl -X PUT 'localhost:9200/accounts' -H 'Content-Type: application/json' -d'{ "mappings": { "person": { "properties": { "last_name": { "type": "text" }, "first_name": { "type": "text" }, "sex": { "type": "keyword" }, "age": { "type": "integer" }, "city": { "type": "keyword" }, "comment": { "type": "text" } } } }}'复制代码
新建文档(document)
curl -XPOST http://localhost:9200/accounts/person/1/ -d '{ "last_name": "wang", "first_name": "kenny", "sex": "male", "age": 35, "city": "hangzhou", "comment": "kenny works for apbtour. "}'curl -XPOST http://localhost:9200/accounts/person/2 -d '{ "last_name": "wang", "first_name": "bob", "sex": "male", "age": 40, "city": "shanghai", "comment": "bob works for apbtour. "}'curl -XPOST http://localhost:9200/accounts/person/3 -d '{ "last_name": "tao", "first_name": "jialin", "sex": "female", "age": 34, "city": "hangzhou", "comment": "jialin works in hangzhou. "}'curl -XPOST http://localhost:9200/accounts/person/4 -d '{ "last_name": "jiang", "first_name": "jockey", "sex": "male", "age": 30, "city": "shanghai", "comment": "jockey works for apbtour. "}'curl -XPOST http://localhost:9200/accounts/person/5 -d '{ "last_name": "yue", "first_name": "qun", "sex": "female", "age": 29, "city": "shanghai", "comment": "yue qun does not works for apbtour. "}'复制代码
当前索引数据如下:
简单查询
查询记录(http方式)
http://localhost:9200/accounts/person/_search?q=last_name:wang GET复制代码
查询记录(curl方式)
curl -XGET 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "term": { "last_name": "wang" } }}'复制代码
查询返回指定字段
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "match_all": {} }, "_source": ["last_name", "first_name"]}'复制代码
查询特定范围(页数)的查询
以下语句显示第3 - 5条记录
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "match_all": {} }, "from": 2, "size": 3}'复制代码
查询特定ID值的数据
curl -XGET 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "terms": { "_id": ["1","4"] } }}'复制代码
更新特定ID值的数据
curl -XPUT 'localhost:9200/accounts/person/1' -H 'Content-Type: application/json' -d '{ "last_name" : "Wang", "first_name" : "fanggang"}'复制代码
删除特定ID的数据
curl -X DELETE 'localhost:9200/accounts/person/7'复制代码
复合查询
单一搜索条件
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "match": { "last_name": "wang" } }}'复制代码
AND
类型搜索
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "bool": { "must": [ { "match": { "last_name": "wang" } }, { "match": { "first_name": "fanggang" } } ] } }}'复制代码
OR
类型搜索
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "bool": { "should": [ { "match": { "last_name": "wang" } }, { "match": { "sex": "male" } } ] } }}'复制代码
排除类型搜索
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "bool": { "must_not": [ { "match": { "last_name": "wang" } }, { "match": { "last_name": "yue" } }, { "match": { "last_name": "kan" } } ] } }}'复制代码
复杂查询(多搜索条件)
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "bool": { "must": [ { "match": { "last_name": "wang" } } ], "must_not": [ { "match": { "first_name": "bob" } } ] } }}'复制代码
过滤查询
查询年龄在32 - 35岁之间的人。
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "query": { "bool": { "must": { "match_all": {} }, "filter": { "range": { "age": { "gte": 32, "lte": 35 } } } } }}'复制代码
聚合查询
Count ... group by
类型聚合查询
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "size": 0, "aggs": { "group_by_city": { "terms": { "field": "city" } } }}'复制代码
由于size设置为0,它并没有返回文档的信息,只是返回了聚合的结果。
统计平均年龄
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "size": 0, "aggs": { "group_by_city": { "terms": { "field": "city" }, "aggs": { "average_age": { "avg": { "field": "age" } } } } }}'复制代码
结果如下:
嵌套聚合查询(范围分组、统计平均值)
例如:先按年龄范围分组,再统计不同地域的平均年龄:
curl -XPOST 'localhost:9200/accounts/person/_search?pretty' -d '{ "size": 0, "aggs": { "group_by_age": { "range": { "field": "age", "ranges": [ { "from": 20, "to": 30 }, { "from": 31, "to": 40 } ] }, "aggs": { "group_by_city": { "terms": { "field": "city" }, "aggs": { "average_age": { "avg": { "field": "age" } } } } } } }}'复制代码
结果如下:
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 5, "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { "group_by_age" : { "buckets" : [ { "key" : "20.0-30.0", "from" : 20.0, "to" : 30.0, "doc_count" : 1, "group_by_city" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "shanghai", "doc_count" : 1, "average_age" : { "value" : 29.0 } } ] } }, { "key" : "31.0-40.0", "from" : 31.0, "to" : 40.0, "doc_count" : 2, "group_by_city" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "hangzhou", "doc_count" : 2, "average_age" : { "value" : 34.5 } } ] } } ] } }}复制代码
以上是ElasticSearch一些基本操作,本文档后续会持续更新,敬请关注。