ES使用之查询方式

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.relationgte(大于等于),表示 value 是实际总数的下限估算值

完全禁用统计

  • 设置为 track_total_hits=false 时,跳过总数计算,返回 "value": 0, "relation": "gte",性能最优但无统计意义
{	//精准获取返回条数
    "track_total_hits":true,
    "query":{
    "match":{"data_info":"下午"}
}}
{
    //表示查询耗时(单位:毫秒)。表示本次查询耗时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 的状态字段,可直接进行精确值匹配

单值匹配
{
    "track_total_hits":500,
    "query":{
    "term":{"data_info.raw":"这是一个晴朗的下午"}
}
}
多值匹配
{
    "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类型查询下午会检索出所有下午的内容

{
  "query": {
    "match": {
      "data_info": "下午"}
    }
}

此处查询虽然传入证据,但是text,match将会分词搜索,可能实际查询内容为:[“下午”, “属于”, “五”,“一”, “假期”],会将包含这些分词内容的信息都查询出来,无顺序限制。

{
  "query": {
    "match": {
      "data_info": "下午属于五一假期"}
    }
}

按照分词顺序匹配完整的短语,提升 match 查询的严格性。

{
  "query": {
    "match_phrase": {
      "data_info": "下午属于五一假期"
    }
  }
}

range查询

固定结构支持 gt(>)、lt(<)、gte(≥)、lte(≤)四种运算符

{
  "range": {
    "field1": {
      "gte": <最小值>,
      "lte": <最大值>
    }
  }
}
{
  "query": {
    "range": {
      "field1": {
        "gte": <最小值>,  // 大于等于
        "lte": <最大值>,  // 小于等于
        "gt": <最小值>,   // 大于
        "lt": <最大值>    // 小于
      }
    }
  }
}

高级查询

布尔查询

组合多个查询条件,支持 must(必须满足)、should(至少满足一个)、must_not(禁止满足),filter

(过滤),mustfilter均可以过滤文档。

must 子句中的 range性能低于filter,must参与相关性评分,filter纯过滤。

{
  "query": {
    "bool": {
      "should": [
        { "match": { "data_info": "下午" } },
        { "match": { "data_info": "电脑" } },
        { "match": { "data_info": "属于" } }
      ],
      "minimum_should_match": 2  // 至少满足 1 个 should 条件
    }
  }
}
{
  "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 的商品

{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": { "gte": 500, "lte": 1000 }
          }
        },
        {
          "range": {
            "stock": { "gt": 50 }
          }
        }
      ]
    }
  }

筛选价格低于 300‌ 评分高于 4.5 的商品

{
  "query": {
    "bool": {
      "should": [
        { "range": { "price": { "lt": 300 } } },
        { "range": { "rating": { "gt": 4.5 } } }
      ],
      "minimum_should_match": 1  // 默认值为 1,可省略
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值