一、前言
以前做的某个项目中包含了大量的查询聚合,现在有时间整理一番,记录一下ES常用查询聚合语法。
二、常用查询语法
2.1 match 查询
match查询,模糊匹配(自动分词),在进行分词的模糊匹配时,要求该字段的类型是text..keyword类型。
GET article/_search
{"query": {"match": {"content": "描述天气状况"}}
}------------------------------------------------------
// 可以使用下面测试数据查看效果.
{"mappings":{"doc":{"properties":{"content":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"view_count":{"type":"long"},"article_name":{"type":"keyword"}}}}}POST article/doc/
{"article_name":"文章一","content":"这是一篇测试文章,想要测试一下match查询语法,你知道吗?","view_count":27
}POST article/doc/
{"article_name":"文章二","content":"这是一篇天气的相关描述,你知道当前的天气状况吗?","view_count":2
}
match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程,match查询相当于模糊匹配,只包含其中一部分关键词就行
2.2 match_all查询
GET article/_search
{"query": {"match_all": {}}
}
2.3 multi_match查询
GET article/_search
{"query": {"multi_match": {"query": "知道","fields": ["content"]}}
}GET article/_search
{"query": {"multi_match": {"query": "文章","fields": ["content"]}}
}
2.4 term查询
term查询相当于sql里面的 a = 'A'; 并且字段的类型不能为分词类型.
GET article/_search
{"query": {"term": {"article_name": {"value": "文章二"}}}
}
2.4 terms查询
terms查询相当于sql中的in
语句.
GET article/_search
{"query": {"terms": {"article_name": ["文章一","文章二"]}}
}
2.5 range查询
gte
表示 大于等于
; gt
表示大于
;
lte
表示小于等于
; lt
表示小于
;
GET article/_search
{"query": {"range": {"view_count": {"gte": 10,"lte": 40}}}
}
2.7 exists查询
GET article1/_search
{"query": {"exists": {"field":"view_count"}}
}-------------------------------------------
再添加一条没有view_count的数据,用来测试
POST article1/doc/
{"article_name":"文章三","content":"这是一篇天气的相关描述,你知道当前的天气状况吗?"
}
2.8 wildcard模糊查询
模糊查询时,需要在关键词前后添加*
, 并且,搜索的这个字段如果是text..keyword
这种动态类型,在搜索时需要在搜索字段后添加.keyword
如果搜索的这个字段的数据类型是keyword
类型,则不需要添加.keyword
,但是按照keyword类型存储长文本,可能会损耗性能。
-- content字段是text...keyword类型GET article/_search
{"query": {"wildcard": {"content.keyword": {"value": "*测试*"}}}
}
2.9 bool查询
bool查询,也就是多条件查询,可以将上述的简单查询条件组成不同的复杂多条件查询;其中bool需要搭配以下的查询:
(1)must查询:sql里的and
关系
(2)must_not查询:和must相反
(3)should查询:sql里的or
关系
(4)filter查询:也是and
关系,只是说filter查询没有分数概念。
-- 查询出 article_name = "文章一" and view_count = 27 and article_name != "文章二"GET article/_search
{"query": {"bool": {"must": [{"term":{"article_name": "文章一"}},{"term":{"view_count": 27}}],"must_not": [{"term":{"article_name": "文章二"}}]}}
}-- 查询出文章名称为"文章一" 或者浏览量为2的数据 ---------------------
GET article/_search
{"query": {"bool": {"should": [{"term":{"article_name": "文章一"}},{"term":{"view_count": 2}}]}}
}-- 查询出文章名称为"文章一"并且浏览量为2的数据 -------------------------
GET article/_search
{"query": {"bool": {"filter": [{"term":{"article_name": "文章一"}},{"term":{"view_count": 2}}]}}
}
2.10 must查询
GET article/_search
{"query": {"bool": {"must": [{"term": {"article_name": {"value": "文章一"}}}]}}
}
2.11 must_not查询
GET article/_search
{"query": {"bool": {"must_not": [{"term": {"article_name": {"value": "文章一"}}}]}}
}
2.11 should查询
GET article/_search
{"query": {"bool": {"should": [{"term": {"article_name": {"value": "文章一"}}}]}}
}
2.13 filter查询
GET article/_search
{"query": {"bool": {"filter": [{"term": {"article_name": {"value": "文章二"}}},{"terms":{"view_count":[2,27]}}]}}
}
2.14 geo_distance地理位置圆形查询
查询方圆3000m范围内所有的用户(geo_distance)
GET user_address_info/_search
{"query": {"geo_distance": {"address_point": [114.067,22.55],"distance": 3000,"unit":"m","distance_type": "arc"}}
}-----------------使用下面测试索引查询-----------------------------------
PUT user_address_info/
{"mappings":{"doc":{"properties": {"address_point": {"type": "geo_point"},"name": {"type": "keyword"}}}}
}---- 插入一条数据
POST user_address_info/doc
{"name":"少年宫","address_point":[114.067406,22.553121]
}