Elasticsearch常用查询

一、查询某个字段为null的结果集

GET /IndexName/_search?size=750
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "fieldName1"
        }
      },
      "filter": [
        {
          "range": {
            "fieldName_Date": {
           "gte": "1980-02-02 00:00:00",
            "lte": "2028-11-02 15:52:08"
            }
          }
        }
      ]
    }
  },
  "sort": {
    "fieldName_Date": {
      "order": "asc"
    }
  },
  "track_total_hits": true
}
  • must_not: 指定文档必须不满足的条件。
  • exists: 检查字段是否存在。
  • field: 字段名,这里是 fieldName1。
  • 作用: 只返回那些 fieldName1 字段不存在的文档。
  • track_total_hits: 是否跟踪总命中数。
  • true: 启用跟踪总命中数。
  • 作用: 返回的响应中将包含匹配查询的总文档数,而不仅仅是返回的结果数。

二、复合查询

GET /IndexName/_search?size=750
{
    "query": {
        "function_score": {
            "query": {
                "bool": {
                    "must": [{
                        "bool": {
                            "should": [{
                                "match_phrase_prefix": {
                                    "fieldName1": {
                                        "query": "你好",
                                        "max_expansions": 1000
                                    }
                                }
                            }, {
                                "wildcard": {
                                    "fieldName1": "你好"
                                }
                            }, {
                                "match_phrase_prefix": {
                                    "fieldName2": {
                                        "query": "你好",
                                        "max_expansions": 1000
                                    }
                                }
                            }, {
                                "wildcard": {
                                    "fieldName2": "你好"
                                }
                            }, {
                                "match_phrase_prefix": {
                                    "fieldName3": {
                                        "query": "*你好*",
                                        "max_expansions": 1000
                                    }
                                }
                            }, {
                                "wildcard": {
                                    "fieldName3": "*你好*"
                                }
                            }],
                            "minimum_should_match": 1
                        }
                    }, {
                        "bool": {
                            "should": [],
                            "minimum_should_match": 1
                        }
                    }],
                    "filter": [{
                        "range": {
                            "fieldName_Date": {
                                "gte": "1980-11-01 00:00:00",
                                "lte": "2025-08-10 16:03:08"
                            }
                        }
                    }]
                }
            },
            "functions": [{
                "gauss": {
                    "fieldName_Date": {
                        "origin": "2025-08-09 16:03:08",
                        "offset": "90d",
                        "scale": "60d",
                        "decay": 0.4
                    }
                },
                "weight": 1
            }]
        }
    },
    "sort": {
        "fieldName_Date": {
            "order": "desc"
        }
    }
}

查询结构

查询的主要部分是function_score,它允许我们基于自定义评分函数来调整文档的相关性得分。

function_score内部结构

  • query: 定义了基本的查询逻辑,即哪些文档应该被考虑在内。
  • functions: 定义了一个或多个用于调整文档得分的函数

query部分

query部分使用了bool查询来组合多个查询条件。bool查询支持must、should、must_not和filter四个子句,这里主要用到了前三个。

  • must: 表示所有列出的查询条件都必须满足。在这个例子中,有两个bool查询被嵌套在must子句中。
    第一个bool查询包含了一个should子句,列出了多个match_phrase_prefix和wildcard查询,它们之间是“或”关系,即只要满足其中一个即可。
  • match_phrase_prefix: 匹配短语前缀,例如"你好"会匹配所有以"你好"开始的短语。
  • wildcard: 使用通配符进行匹配,如"你好"会匹配任何包含"你好"的字段值。
  • 第二个bool查询的should子句为空,因此实际上不会影响查询结果。
  • filter: 这个子句用于过滤结果,不影响文档的得分计算。这里的过滤条件是一个日期范围:
  • fieldName_Date字段的值必须大于等于1980-11-01 00:00:00且小于等于2025-08-10 16:03:08。

max_expansions: 1000

  • max_expansions: 这个参数用于限制 match_phrase_prefix 查询的扩展数量。

  • 作用: 在 match_phrase_prefix 查询中,Elasticsearch
    会尝试将前缀扩展为可能的完整词汇或短语。max_expansions 参数限制了这种扩展的数量,以防止查询变得过于复杂和耗时。

  • 示例

  • 假设你有一个 match_phrase_prefix 查询,查询词是 “你好”,并且 max_expansions 设置为 1000:

    Elasticsearch 会尝试将 “你好” 扩展为所有可能的完整短语,例如 “你好世界”, “你好朋友”, “你好中国” 等等。
    如果不设置 max_expansions,Elasticsearch 可能会生成大量的扩展项,这可能会导致查询性能下降。 通过设置
    max_expansions: 1000,你可以限制扩展的数量,确保查询在合理的时间内完成。

minimum_should_match: 1

  • minimum_should_match: 这个参数用于指定在 should 子句中,至少需要满足多少个条件。
  • 作用: 在 bool 查询的 should 子句中,可以列出多个查询条件。minimum_should_match
    参数决定了这些条件中有多少个必须满足才能使整个 should 子句为真。

functions部分

  • gauss: 高斯衰减函数,用来降低与特定值距离较远的文档的得分。
  • origin: 衰减函数的中心点,这里是2025-08-09 16:03:08。
  • offset: 在origin之前不开始衰减的距离,这里是90天。
  • scale: 控制衰减速度的距离,这里是60天。
  • decay: 当文档距离origin达到scale时,得分减少到原来的百分比,这里是40%。

排序

  • sort: 指定了文档的排序方式。
  • fieldName_Date字段按照降序排列,即最新的文档将首先出现。

总结

此查询旨在从索引IndexName中找出所有在给定日期范围内,且至少在一个指定字段(fieldName1, fieldName2, 或 fieldName3)中包含关键词“你好”的文档。同时,通过高斯衰减函数对结果进行评分调整,使得接近2025-08-09 16:03:08的文档得分更高。最终,返回的结果将按日期降序排列,最多返回750条记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值