ElasticSearch常用查询(一)
一、前言
以前做的某个项目中包含了大量的查询聚合,现在有时间整理一番,记录一下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]
}