• ElasticSearch查询


    ES 查询

    使用情况

    • 过滤情况(filtering context):对文档进行过滤

    • 查询情况(query context):对文档进行评分

    过滤查询的结果较少,结果会被缓存到内存中。评分查询计算较多(计算相关性),不会缓存。

    通常的规则是,使用查询(query)语句来进行 全文 搜索或者其它任何需要影响 相关性得分 的搜索。除此以外的情况都使用过滤(filters)。

    最重要的查询

    match_all

    查询简单的匹配所有文档,它经常与 filter 结合使用

    { "match_all": {}}
    
    • 1

    match

    无论你在任何字段上进行的是全文搜索还是精确查询,match 查询是你可用的标准查询。

    match 会进行分词

    { "match": { "tweet": "About Search" }}
    
    • 1

    multi_match

    multi_match 查询可以在多个字段上执行相同的 match 查询

    {
        "multi_match": {
            "query":    "full text search",
            "fields":   [ "title", "body" ] // 对 title、body 字段进行查询
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    range

    range 查询找出那些落在指定区间内的数字或者时间

    gt:大于

    gte:大于等于

    lt:小于

    lte:小于等于

    {
        "range": {
            "age": {
                "gte":  20,
                "lt":   30
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    term

    term 查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串

    { "term": { "age":    26           }}
    { "term": { "date":   "2014-09-01" }}
    { "term": { "public": true         }}
    { "term": { "tag":    "full_text"  }}
    
    • 1
    • 2
    • 3
    • 4

    terms

    允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件

    { "terms": { "tag": [ "search", "full_text", "nosql" ] }}
    
    • 1

    exists missing

    exists 查询和 missing 查询被用于查找那些指定字段中有值 (exists) 或无值 (missing) 的文档。这与 SQL 中的 IS_NULL (missing) 和 NOT IS_NULL (exists) 在本质上具有共性

    {
        "exists":   {
            "field":    "title"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这些查询经常用于某个字段有值的情况和某个字段缺值的情况。

    组合查询

    布尔查询:将多查询组合成单一查询

    接收参数:

    must:文档 必须 匹配这些条件才能被包含进来

    must_not:文档  必须不 匹配这些条件才能被包含进来

    should:如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分

    filter必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

    {
        "bool": {
            "must":     { "match": { "title": "how to make millions" }},
            "must_not": { "match": { "tag":   "spam" }},
            "should": [
                { "match": { "tag": "starred" }}
            ],
            "filter": {
              "range": { "date": { "gte": "2014-01-01" }} 
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    也可以通过将布尔查询放到 filter 下实现多标准的过滤,并且不参与评分计算

    {
        "bool": {
            "must":     { "match": { "title": "how to make millions" }},
            "must_not": { "match": { "tag":   "spam" }},
            "should": [
                { "match": { "tag": "starred" }}
            ],
            "filter": {
              "bool": { 
                  "must": [
                      { "range": { "date": { "gte": "2014-01-01" }}},
                      { "range": { "price": { "lte": 29.99 }}}
                  ],
                  "must_not": [
                      { "term": { "category": "ebooks" }}
                  ]
              }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    constant_score 查询将一个不变的常量评分应用于所有匹配的文档,可以用来取代只有 filter 语句的布尔查询

    {
        "constant_score":   {
            "filter": {
                "term": { "category": "ebooks" } 
            }
        }
    }
    {
        "filter": {
            "bool": {
               "must": {
                    "term": { "category": "ebooks" }
                } 
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    验证查询

    通过 validate-query API 可以用来验证查询是否合法

    GET /gb/tweet/_validate/query?explain 
    {
       "query": {
          "tweet" : {
             "match" : "really powerful"
          }
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    基于YOLOv8模型的120类狗狗目标检测系统(PyTorch+Pyside6+YOLOv8模型)
    SpringCloud之Stream框架集成RocketMQ消息中间件
    公钥私钥传输,以及对CA证书的理解
    游戏里的猎头
    git遇到的报错
    游戏类app有哪些变现方式?
    TCGA里面的任意基因做生存分析 批量生存分析
    c语言:解决判断两个字符串是不是互为旋转字符的问题
    Nessus安全测试工具使用教程
    操作系统初始化
  • 原文地址:https://blog.csdn.net/m0_37991005/article/details/126152267