Deprecated: 函数 get_currentuserinfo 自版本 4.5.0 起已弃用!请使用 wp_get_current_user() 替代。 in /data/home/qxu1142130176/htdocs/wp-includes/functions.php on line 5383
最新消息:

Elasticsearch 5.X 基本语法之查询语句解析

Elasticsearch 前端收藏 1866浏览

bg2017081701

Elasticsearch查询有两种基本方式:URI和request body
下面先看一个查询示例:
通过URI方式查询执行如下命令:

#REST request URI  
GET /travel/travelList/_search?q=*&sort=fb_datetime:desc&pretty

返回结果如下:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 37736,
    "max_score": null,
    "hits": [
      {
        "_index": "travel",
        "_type": "travelList",
        "_id": "123456789",
        "_score": null,
        "_source": {}
      }
    ]
}
这里q=*参数表示匹配所有文档。sort=fb_datetime:desc参数表示按fb_datetime对结果进行倒序排序。pretty参数表示格式化JSON结果。
至于响应,我们看到以下部分:
took – Elasticsearch执行搜索的时间(以毫秒为单位)
timed_out – 告诉我们搜索是否超时
_shards – 告诉我们搜索了多少分片,以及成功/失败的搜索分片的计数
hits – 搜索结果
hits.total – 符合我们的搜索条件的文档总数
hits.hits – 搜索结果的实际数组(默认为前10个文档)
hits.sort – 结果排序键(如果按分数排序,则缺少)
hits.hits._index – 本次查询的索引(index)
hits.hits._type – 本次查询的类型(type)
hits.hits._id – 查询到的文档(doc)对应的唯一索引
hits.hits._score – 计分
hits.hits._source – 包含完整的文档(doc)
同样的查询规则通过request body方式查询时语法如下:
#REST request body  
GET /travel/travelList/_search  
{  
  "query": { "match_all": {} },  
  "sort": [  
    { "fb_datetime": "asc" }  
  ]  
}
Elasticsearch提供了一种JSON风格的语言,可用于执行查询。这被称为Query DSL。查询语言相当全面,实际学习它还是要从几个基本的例子开始。
#查询所有    
GET /travel/travelList/_search  
{  
  "query": { "match_all": {} }  
}  

#查询一条  注: 默认情况下查询的就是所有数据,所以示例中"query": { "match_all": {} }不是必写的  
GET /travel/travelList/_search  
{  
  "query": { "match_all": {} },  
  "size": 1  
}  

#查询第11至第20条数据 注:from默认从0开始的  
GET /travel/travelList/_search  
{  
  "query": { "match_all": {} },  
  "from": 10,  
  "size": 10  
}  

#按balance降序  
GET /travel/travelList/_search  
{  
  "query": { "match_all": {} },  
  "sort": { "balance": { "order": "desc" } }  
}  

#只查询fb_datetime和balance  
GET /travel/travelList/_search  
{  
  "query": { "match_all": {} },  
  "_source": ["fb_datetime", "balance"]  
}
可以将match查询视为基本的字段化搜索查询(即针对特定字段或字段集进行的搜索)。
#查询account_number=20的帐户  
GET /travel/travelList/_search  
{  
  "query": { "match": { "account_number": 20 } }  
}  
#查询在address中包含术语“mill”的所有帐户  
GET /travel/travelList/_search  
{  
  "query": { "match": { "address": "mill" } }  
}  
#查询在address中包含“mill”或“lane”一词的所有帐户:  
GET /travel/travelList/_search  
{  
  "query": { "match": { "address": "mill lane" } }  
}  
#此示例是match(match_phrase)的变体,查询在address中包含短语“mill lane”的所有帐户:  
GET /travel/travelList/_search  
{  
  "query": { "match_phrase": { "address": "mill lane" } }  
}
bool查询允许我们撰写较小的查询到使用布尔逻辑更大的查询
#此示例编写两个match查询,即查询address中包含“mill”和“lane”的所有帐户。bool must子句表示所有条件必须满足 类似于判断条件中的&&。  
GET /travel/travelList/_search  
{  
  "query": {  
    "bool": {  
      "must": [  
        { "match": { "address": "mill" } },  
        { "match": { "address": "lane" } }  
      ]  
    }  
  }  
}  
#相比之下,此示例中两个match则是查询并address中包含“mill”或“lane”的所有帐户。bool should类似于判断条件中的||  
GET /travel/travelList/_search  
{  
  "query": {  
    "bool": {  
      "should": [  
        { "match": { "address": "mill" } },  
        { "match": { "address": "lane" } }  
      ]  
    }  
  }  
}  
#此示例的两个match查询,则是查询address中既不包含“mill”也不包含“lane”的所有帐户。  
GET /travel/travelList/_search  
{  
  "query": {  
    "bool": {  
      "must_not": [  
        { "match": { "address": "mill" } },  
        { "match": { "address": "lane" } }  
      ]  
    }  
  }  
}  
#我们可以在查询中同时合并must,should和must_not子句bool。此外,我们可以bool在任何这些bool子句中组合查询来模拟任何复杂的多级布尔逻辑。此示例返回任何age=40但state!=ID的所有帐户:  
GET /travel/travelList/_search  
{  
  "query": {  
    "bool": {  
      "must": [  
        { "match": { "age": "40" } }  
      ],  
      "must_not": [  
        { "match": { "state": "ID" } }  
      ]  
    }  
  }  
}
关于过滤器filters的查询
#range查询,它允许我们通过一定范围的值来过滤文档。这通常用于数字或日期过滤。  
#使用bool查询返回余额介于20000和30000(含)之间的所有帐户。换句话说,我们想要找出余额大于或等于20000且小于或等于30000的帐户。  
GET /travel/travelList/_search  
{  
  "query": {  
    "bool": {  
      "must": { "match_all": {} },  
      "filter": {  
        "range": {  
          "balance": {  
            "gte": 20000,  
            "lte": 30000  
          }  
        }  
      }  
    }  
  }  
}  
#解析上面的查询,bool查询包含一个match_all查询(查询部分)和一个range查询(过滤器部分)。我们可以将任何其他查询替换为查询和过滤器部分。
关于分组聚合查询
#这个例子按状态分组所有的帐户,然后返回前10(默认)状态,按照count递减排序(也是默认)  
GET /travel/travelList/_search  
{  
  "size": 0,  
  "aggs": {  
    "group_by_state": {  
      "terms": {  
        "field": "state.keyword"  
      }  
    }  
  }  
}  
#与SQL语法相识:SELECT state, COUNT(*) FROM travel/travelList GROUP BY state ORDER BY COUNT(*) DESC  
#注:设置size=0为不显示搜索匹配。你可以不写size=0看看返回结果  
  
#下面示例计算按州(state)的平均帐户余额(仅针对按降序排序的前10个州)  
GET /travel/travelList/_search  
{  
  "size": 0,  
  "aggs": {  
    "group_by_state": {  
      "terms": {  
        "field": "state.keyword"  
      },  
      "aggs": {  
        "average_balance": {  
          "avg": {  
            "field": "balance"  
          }  
        }  
      }  
    }  
  }  
}  
  
#注意我们如何在average_balance聚合中嵌套group_by_state聚合。这是所有聚合的常见模式。您可以任意嵌套聚合中的聚合,以提取您需要从数据中获得的透视摘要。基于之前的聚合,现在我们以降序对平均余额进行排序  
GET /travel/travelList/_search  
{  
  "size": 0,  
  "aggs": {  
    "group_by_state": {  
      "terms": {  
        "field": "state.keyword",  
        "order": {  
          "average_balance": "desc"  
        }  
      },  
      "aggs": {  
        "average_balance": {  
          "avg": {  
            "field": "balance"  
          }  
        }  
      }  
    }  
  }  
}  
  
#这个例子演示了我们如何根据年龄段(20-29,30-39和40-49),然后按性别分组,然后最终得到每个年龄段的每个性别的平均帐户余额:  
GET /travel/travelList/_search  
{  
  "size": 0,  
  "aggs": {  
    "group_by_age": {  
      "range": {  
        "field": "age",  
        "ranges": [  
          {  
            "from": 20,  
            "to": 30  
          },  
          {  
            "from": 30,  
            "to": 40  
          },  
          {  
            "from": 40,  
            "to": 50  
          }  
        ]  
      },  
      "aggs": {  
        "group_by_gender": {  
          "terms": {  
            "field": "gender.keyword"  
          },  
          "aggs": {  
            "average_balance": {  
              "avg": {  
                "field": "balance"  
              }  
            }  
          }  
        }  
      }  
    }  
  }  
}

转载请注明:前端收藏 » Elasticsearch 5.X 基本语法之查询语句解析