ES的QueryFiltermetricbucketing使用详解
Posted sunsky303
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES的QueryFiltermetricbucketing使用详解相关的知识,希望对你有一定的参考价值。
由于笔者在实际项目仅仅将ES用作索引数据库,并没有深入研究过ES的搜索功能。而且鉴于笔者的搜索引擎知识有限,本文将仅仅介绍ES简单(非全文)的查询API。
笔者原本打算在本文中介绍聚合API的内容,但是写着写着发现文章有点过长,不便于阅读,故将聚合API的内容移至下一篇博客中。
引言
单单介绍理论和API是乏味和低效率的,本文将结合一个实际的例子来介绍这些API。下表是本文数据表的表结构,表名(type)为“student”。注意,studentNo是本表的id,也就是_id字段的值与studentNo的值保持一致。
字段名 | 字段含义 | 类型 | 是否能被索引 | 备注 |
---|---|---|---|---|
studentNo | 学号 | string | 是 | id |
name | 姓名 | string | 是 | |
sex | 性别 | string | 是 | |
age | 年龄 | integer | 是 | |
birthday | 出生年月 | date | 是 | |
address | 家庭住址 | string | 是 | |
classNo | 班级 | string | 是 | |
isLeader | 是否为班干部 | boolean | 是 |
上面的表结构所对应的mapping如下,将数据保存在索引名为“student”的索引中。
{
"student": {
"properties": {
"studentNo": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type": "string",
"index": "not_analyzed"
},
"male": {
"type": "string",
"index": "not_analyzed"
},
"age": {
"type": "integer"
},
"birthday": {
"type": "date",
"format": "yyyy-MM-dd"
},
"address": {
"type": "string",
"index": "not_analyzed"
},
"classNo": {
"type": "string",
"index": "not_analyzed "
},
"isLeader": {
"type": "boolean"
}
}
}
}
索引中保存的数据如下,下面介绍的所有API都将基于这个数据表。
studentNo | name | male | age | birthday | classNo | address | isLeader |
---|---|---|---|---|---|---|---|
1 | 刘备 | 男 | 24 | 1985-02-03 | 1 | 湖南省长沙市 | true |
2 | 关羽 | 男 | 22 | 1987-08-23 | 2 | 四川省成都市 | false |
3 | 糜夫人 | 女 | 19 | 1990-06-12 | 1 | 上海市 | false |
4 | 张飞 | 男 | 20 | 1989-07-30 | 3 | 北京市 | false |
5 | 诸葛亮 | 男 | 18 | 1992-04-27 | 2 | 江苏省南京市 | true |
6 | 孙尚香 | 女 | 16 | 1994-05-21 | 3 | false | |
7 | 马超 | 男 | 19 | 1991-10-20 | 1 | 黑龙江省哈尔滨市 | false |
8 | 赵云 | 男 | 23 | 1986-10-26 | 2 | 浙江省杭州市 | false |
查询API
ES中的查询非常灵活,为用户提供了非常方便而强大的API。个人觉得ES的调用接口设计得非常好,所有接口合理且风格一致,值得好好研究!
Query和Filter
ES为用户提供两类查询API,一类是在查询阶段就进行条件过滤的query查询,另一类是在query查询出来的数据基础上再进行过滤的filter查询。这两类查询的区别是:
- query方法会计算查询条件与待查询数据之间的相关性,计算结果写入一个score字段,类似于搜索引擎。filter仅仅做字符串匹配,不会计算相关性,类似于一般的数据查询,所以filter得查询速度比query快。
- filter查询出来的数据会自动被缓存,而query不能。
query和filter可以单独使用,也可以相互嵌套使用,非常灵活。
Query查询
下面的情况下适合使用query查询:
- 需要进行全文搜索。
- 查询结果依赖于相关性,即需要计算查询串和数据的相关性。
(1)Match All Query
查询所有的数据,相当于不带条件查询。下面的代码是一个典型的match_all查询的调用方式。
curl -XPOST "192.168.1.101:9200/student/student/_search" -d
‘
{
"query": {
"match_all": {}
}
}
‘
查询结果如下。其他所有的查询都是返回这种格式的数据。
{
"took": 156, // 查询耗时(毫秒)
"timed_out": false, // 是否超时
"_shards": {
"total": 5, // 总共查询的分片数
"successful": 5, // 查询成功的分片数
"failed": 0 // 查询失败的分片数
},
"hits": {
"total": 8, // 本次查询的记录数
"max_score": 1, // 查询所有数据中的最大score
"hits": [ // 数据列表
{
"_index": "student", // 数据所属的索引名
"_type": "student", // 数据所属的type
"_id": "4", // 数据的id值
"_score": 1, // 该记录的score
"_source": { // ES将原始数据保存到_source字段中
"studentNo": "4",
"name": "张飞",
"male": "男",