query 查询
'query': { 'bool': { 'must': mustArray } }
mustArray 是一个数组,用于构建 Elasticsearch 查询的 must 条件。must 条件表示所有的条件都必须匹配。
查询时间在 beginTime 和 endTime 之间的数据
exports.getQueryWithMust = async (req, res) => {
const searchQuery = {
query: {
bool: {
must: [
{
range: {
request_time: {
gt: req.body.beginTime,
lt: req.body.endTime,
},
},
},
],
},
},
};
client
.search({
index: "students",
body: searchQuery,
})
.then((response) => {
res.status(200).json({
data: response.body.hits.hits,
});
})
.catch((error) => {
console.error(error);
});
};
term 查询
是 Elasticsearch 中的一种查询类型,用于精确匹配某个字段的值。它会查找指定字段中与给定值完全匹配的文档。
exports.getQueryWithMust = async (req, res) => {
const searchQuery = {
query: {
term: {
"db_type.keyword": req.body.db_type,
},
},
};
client
.search({
index: "students",
body: searchQuery,
})
.then((response) => {
// ....
})
.catch((error) => {
console.error(error);
});
};
aggs 聚合
是 Elasticsearch 中一种强大的功能,可以对文档进行分组、统计和计算等操作。
'aggs': aggQuery,
在刚刚使用 query 获取对应时间区间的数据,计算年龄的平均值。
定义了一个名为 avg_age 的聚合操作,使用 avg 聚合类型来计算 age 字段的平均值。field 字段指定了要应用聚合的字段名称。
exports.getQueryWithMust = async (req, res) => {
const searchQuery = {
query: {
// ......
},
aggs: {
avg_age: {
avg: {
field: 'age'
}
}
}
};
client
.search({
index: "students",
body: searchQuery,
})
.then((response) => {
const avgAge = response.body.aggregations.avg_age.value;
// .....
})
.catch((error) => {
console.error(error);
});
};
_source
指定你想要检索的文档字段。例如,如果你只想获取文档的特定字段,你可以通过 _source 参数进行配置。
exports.getQueryWithMust = async (req, res) => {
const searchQuery = {
// ....
"_source": ["db_type"],
// ....
},
};
// ....
};
接下来,来看一个比较长的
const searchQuery = {
aggs: {
over_time: {
date_histogram: {
field: "request_time",
interval: "year",
time_zone: "+08:00",
min_doc_count: 0,
extended_bounds: {
min: "2021-01-01T00:00:00Z",
max: "2023-12-31T23:59:59Z"
}
},
aggs: {
db: {
terms: { field: "db_type.keyword" },
aggs: {
avg_age: { avg: { field: "age" } },
max_rt: { max: { field: "rt" } }
}
}
}
}
},
size: 0
}
over_time: 是一个自定义的聚合名称,用于标识时间直方图聚合操作。
date_histogram: 是一个时间直方图聚合操作,用于按指定的时间间隔对文档进行聚合。在这里,我们按年份进行聚合。
field: 指定要聚合的字段名称,这里是 "request_time",表示按照文档中的 "request_time" 字段进行聚合。
interval: 指定时间间隔的单位,这里是 "year",表示按年份进行聚合。
time_zone: 指定聚合结果中的时间区域,这里是 "+08:00",表示东八区时区。
min_doc_count: 指定每个时间桶中的最小文档计数,这里是 0,表示即使没有文档落在某个时间桶内,也会返回该时间桶。
extended_bounds: 指定时间范围的上下界,这里是 "2021-01-01T00:00:00Z" 到 "2023-12-31T23:59:59Z",表示聚合的时间范围从 2021 年到 2023 年。
aggs: 是对时间直方图聚合结果进行嵌套聚合的子聚合操作。
db: 是一个术语(Terms)聚合操作,用于按指定字段的值进行聚合。这里我们按 "db_type.keyword" 字段进行聚合。
field: 指定要聚合的字段名称,这里是 "db_type.keyword",表示按照文档中的 "db_type" 字段进行聚合。
aggs: 是对聚合结果进行嵌套聚合的子聚合操作。
avg_age: 是一个平均值(Average)聚合操作,用于计算指定字段的平均值。这里我们计算 "age" 字段的平均值。
field: 指定要计算平均值的字段名称,这里是 "age"。
max_rt: 是一个最大值(Max)聚合操作,用于计算指定字段的最大值。这里我们计算 "rt" 字段的最大值。
field: 指定要计算最大值的字段名称,这里是 "rt"。
size: 指定返回的文档数量,这里是 0,表示仅返回聚合结果,不返回具体的文档。
这个查询将执行以下操作:
- 过滤出年龄大于20且小于100的文档。
- 按年份对文档进行分桶,并计算每个月份内每种
db_type的平均年龄和最大rt值。 - 返回的结果中,不包含实际的文档,只包含聚合结果。