文章目录
ES中的数据查询
返回字段含义

track_total_hits
track_total_hits
是 Elasticsearch 中用于 控制匹配文档总数统计行为 的关键参数。就算统计total.value的数量,如果是true就准确返回匹配的数量,如果是false就不匹配,如果设置数量就在数量范围内获取,超过了就算返回设置的默认值
精确统计模式
- 当设置为
track_total_hits=true
时,Elasticsearch 会 强制计算所有匹配文档的精确总数 ,无论数量多大。此时返回的hits.total.relation
始终为eq
(精确相等)15。 - 适用场景:需精准分页、数据导出等对总数准确性要求高的场景
估算模式
- 默认值为
track_total_hits=10000
,当匹配文档数 超过设定阈值 (如默认 10,000)时,返回hits.total.relation
为gte
(大于等于),表示value
是实际总数的下限估算值
完全禁用统计
- 设置为
track_total_hits=false
时,跳过总数计算,返回"value": 0, "relation": "gte"
,性能最优但无统计意义
json
{ //精准获取返回条数
"track_total_hits":true,
"query":{
"match":{"data_info":"下午"}
}}
json
{
//表示查询耗时(单位:毫秒)。表示本次查询耗时21毫秒
"took": 21,
//标识查询是否超时。示例中的 false 表示未超时
"timed_out": false,
//描述分片执行情况
"_shards": {
//参与查询的分片总数
"total": 3,
//成功执行查询的分片数
"successful": 3,
//查询过程中被跳过的分片数量
"skipped": 0,
//执行失败的分片数
"failed": 0
},
"hits": {
"total": {
//匹配文档总数
"value": 4,
//表示 value 的精确性两种
//eq(exact):精确计数
//gte估算
"relation": "eq"
},
"max_score": 2.622515,
"hits": [
{ // 索引名
"_index": "ldsx_test_2025.04.28",
// 此条数据唯一标识
"_id": "HM-2hJYBpFEB9Te9Nw5R",
// 文档匹配评分
"_score": 2.622515,
// 文档原始数据
"_source": {
"data_name": "node11",
"created_at": "2025-04-28 15:05:31",
"data_info": "下午属于五一假期"
}
},
{
"_index": "ldsx_test_2025.04.28",
"_id": "Es83e5YBpFEB9Te91w6C",
"_score": 0.5753642,
"_source": {
"data_name": "node1",
"created_at": "2025-04-28 15:05:31",
"data_info": "这是一个晴朗的下午"
}
},
{
"_index": "ldsx_test_2025.04.28",
"_id": "E884e5YBpFEB9Te9Fg7H",
"_score": 0.3718877,
"_ignored": [
"created_at"
],
"_source": {
"data_name": "node2",
"created_at": "2025-04-28111 15:05:31",
"data_info": "这是一个晴朗的下午1"
}
},
{
"_index": "ldsx_test_2025.04.28",
"_id": "FM84e5YBpFEB9Te9Sw7e",
"_score": 0.35767543,
"_source": {
"data_name": "node3",
"created_at": "2025-04-28 15:05:31",
"data_info": "这是一个晴朗的下午,你好"
}
}
]
}
}
精准匹配(term)
适用于keyword类型,直接以原始值存储,适合使用 term
查询精准匹配
包括整数、浮点数等数值型字段,term
查询可直接匹配精确数值
如创建时间、更新时间等结构化时间字段,可通过 term
查询精准匹配特定时间点
例如标记为 true
/false
的状态字段,可直接进行精确值匹配
单值匹配
json
{
"track_total_hits":500,
"query":{
"term":{"data_info.raw":"这是一个晴朗的下午"}
}
}
多值匹配
json
{
"track_total_hits":500,
"query":{
"terms":{"data_name":["node6","node9"]}
}}
全文检索(match)
虽然 match
查询主要用于 text
类型,但也可作用于以下类型,但行为有所不同
**keyword
类型字段**
- 直接匹配字段的完整值,不进行分词(等效于
term
查询)。例如,查询"status.keyword": "active"
时需严格匹配active
数值、日期、布尔类型字段
- 不会分词,直接将查询字符串转换为对应类型进行匹配。例如,查询
"price": 100
会精确匹配数值100
text 类型字段
data_info主字段为text类型查询下午会检索出所有下午的内容
json
{
"query": {
"match": {
"data_info": "下午"}
}
}
此处查询虽然传入证据,但是text,match将会分词搜索,可能实际查询内容为:["下午", "属于", "五","一", "假期"],会将包含这些分词内容的信息都查询出来,无顺序限制。
json
{
"query": {
"match": {
"data_info": "下午属于五一假期"}
}
}
按照分词顺序匹配完整的短语,提升 match
查询的严格性。
json
{
"query": {
"match_phrase": {
"data_info": "下午属于五一假期"
}
}
}
range查询
固定结构支持 gt
(>)、lt
(<)、gte
(≥)、lte
(≤)四种运算符
json
{
"range": {
"field1": {
"gte": <最小值>,
"lte": <最大值>
}
}
}
json
{
"query": {
"range": {
"field1": {
"gte": <最小值>, // 大于等于
"lte": <最大值>, // 小于等于
"gt": <最小值>, // 大于
"lt": <最大值> // 小于
}
}
}
}
高级查询
布尔查询
组合多个查询条件,支持 must
(必须满足)、should
(至少满足一个)、must_not
(禁止满足),filter
(过滤),must
和filter
均可以过滤文档。
must
子句中的 range性能低于filter
,must参与相关性评分,filter纯过滤。
json
{
"query": {
"bool": {
"should": [
{ "match": { "data_info": "下午" } },
{ "match": { "data_info": "电脑" } },
{ "match": { "data_info": "属于" } }
],
"minimum_should_match": 2 // 至少满足 1 个 should 条件
}
}
}
json
{
"query": {
"bool": {
"must": [
{ "term": { "category": "electronics" }}, // 必须类目为电子产品
{ "term": { "in_stock": true }} // 必须有库存
],
"should": [
{ "term": { "brand": "Apple" }}, // 品牌为苹果
{ "term": { "brand": "Samsung" }} // 品牌为三星
],
"must_not": [
{ "terms": { "color": ["red", "blue"] }} // 排除红色和蓝色商品
],
"filter": [
{ "range": { "price": { "gte": 1000, "lte": 5000 }}} // 过滤价格范围
],
"minimum_should_match": 1 // 至少满足一个should条件
}
}
}
筛选价格在 500~1000
且库存量大于 50
的商品
json
{
"query": {
"bool": {
"must": [
{
"range": {
"price": { "gte": 500, "lte": 1000 }
}
},
{
"range": {
"stock": { "gt": 50 }
}
}
]
}
}
筛选价格低于 300
或 评分高于 4.5
的商品
json
{
"query": {
"bool": {
"should": [
{ "range": { "price": { "lt": 300 } } },
{ "range": { "rating": { "gt": 4.5 } } }
],
"minimum_should_match": 1 // 默认值为 1,可省略
}
}
}