一、查询某个字段为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条记录。