elasticsearch 查询检索

一、查询方式列举

1、多维度查询 关键词:bool must match

复制代码
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "server_name": "www.test.com"
          }
        },
        {
          "range": {  //时间查询
            "createTime": {
              "gte": "2025-04-14T00:00:00+08:00",
              "lte": "2025-04-15T00:00:00+08:00"
            }
          }
        }
      ]
    }
  },
  "_source": {
    "includes": [  //查询字段
      "title",
      "price"
    ],
    "exclude": [   //排除字段
      "organId"
    ]
  }
}

2、模糊查询 关键词:wildcard

匹配出状态码status 以 5 开头的日志

复制代码
{
  "query": {
    "wildcard": {"status": "5*"}
  }
}

3、指定某个值 同时匹配多个字段 关键词:multi_match

query 要查询的值

fields 要匹配的字段【数组】

匹配出 字段code和status 为400的所有日志

复制代码
{
  "query": {
    "multi_match": {
        "query":    "400",
        "fields":   [ "code", "status" ]
    }
  }
}

4、一个字段查询多个值

关键词:terms

{ "字段":[ 要匹配的多个值 ] }

复制代码
{
  "query": {
    "terms": {
        "status": ["400","402","406"]
    }
  }
}

5、字段排序

复制代码
//单字段
{
  "sort": {
    "createTime": {
      "order": "asc"
    }
  }
}
//多字段
{
    "sort": [
        {
            "createTime": {
                "order": "asc"
            }
        },
        {
            "updateTime": {
                "order": "desc"
            }
        }
    ]
}

6、高量查询

复制代码
GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}

7、自定义高亮

复制代码
{
  "query": {
    "term": {
      "description": {
        "value": "iphone"
      }
    }
  },
  "highlight": {
    "post_tags": ["</span>"], 
    "pre_tags": ["<span style='color:red'>"],
    "fields": {
      "*":{}
    }
  }
}

8、模糊查询(fuzzy)

复制代码
fuzzy 查询是 term 查询的模糊等价。它允许用户搜索词条与实际词条的拼写出现偏差,但是偏差的编辑距离不得超过2:
GET /heima/_search
{
  "query": {
    "fuzzy": {
        "title": {
            "value":"appla",
            "fuzziness":1
        }
    }
  }
}

9、指定间隔分组

interval:间隔,

min_doc_count:过滤为0的分组

复制代码
{
  "size":0,
  "aggs":{
    "price":{
      "histogram": {
        "field": "price",
        "interval": 5000,
        "min_doc_count": 1
      }
    }
  }
}

10、elasticsearch 深分页

产生原因:from、size 两字段过大,es默认是10000
解决方式:
(1)深度分页之scroll,滚动查询、每次请求两条。可以定制 scroll = 5m意味着该窗口过期时间为5分钟。
复制代码
 GET /student/_search?scroll=5m
 {
   "query": {
     "match_all": {}
   },
   "size": 2
 }

后边查询的时候需要带上 _scroll_id 参数

复制代码
 GET /_search/scroll
 {
   "scroll":"5m",
   "scroll_id":"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAC0YFmllU"
 }
(2)search_after 使用索引全局唯一标识字段 、官方推荐使用 _uid 作为全局唯一值,但是只要能表示其唯一性就可以。
复制代码
  GET /student/_search
  {
    "query":{
      "match_all": {}
    },
    "size":2,
    "sort":[
     {
        "uid": "desc"
    }  
   ]
 }

下一次分页,需要将上述分页结果集的最后一条数据的值带上。

复制代码
  GET /student/student/_search
  {
    "query":{
      "match_all": {}
    },
    "size":2,
    "search_after":[1005],
    "sort":[
      {
       "uid": "desc"
     }  
   ]
 }
深分页对比
分页方式 性能 优点 缺点 场景
from+size 灵活性好,实现简单 深度分页问题 数据量比较小,能容忍深度分页问题
scroll 解决了深度分页问题 无法反应数据的实时性(快照版本),维护成本高,需要维护一个 海量数据的导出需要查询海量结果集的数据
search_after 性能最好、不存在深度分页问题、能够反映数据的实时变更 实现复杂,需要有一个全局唯一的字段、连续分页的实现比较复杂,因为每一次查询都需要上次查询的结果 海量数据的分页

注: ElasticSearch Java API之高级查询(分页查询,高亮查询,正则表达式查询,聚合查询等)

参考:
https://blog.csdn.net/qq_37774171/article/details/122931766
https://blog.csdn.net/qq_42402854/article/details/126615064

相关推荐
阿里云大数据AI技术1 小时前
通过阿里云Milvus与通义千问VL大模型,快速实现多模态搜索
大数据·云计算
TracyCoder1232 小时前
ElasticSearch深入解析(二):核心概念
大数据·elasticsearch·搜索引擎
用户199701080182 小时前
深入研究:Shopee商品详情API接口详解
大数据·爬虫·数据挖掘
Fanerma1212 小时前
来访登记二维码生成
大数据·安全
holly_交易系统3 小时前
如何开发一套TRS交易系统:架构设计、核心功能与风险控制
大数据·人工智能·软件工程·软件构建·开源软件
李菠菜3 小时前
常用Hadoop HDFS命令详解与实用指南
大数据·hadoop·hdfs
QX_hao4 小时前
【Project】基于spark-App端口懂车帝数据采集与可视化
大数据·分布式·spark
End9284 小时前
Mapreduce中maven打包
大数据·mapreduce
riveting4 小时前
明远智睿2351开发板:性价比之选,赋能智能硬件创新
大数据·linux·图像处理·人工智能·智能硬件