我们有一些员工需要找到我们没有进入他们的生日或者出生于1963年3月1日之前的人:
{
"query": {
"bool": {
"should": [
{
"bool": {
"must_not": [{ "exists": { "field": "birthday" } }]
}
},
{
"bool": {
"filter": [{ "range": {"birthday": { "lte": 19630301 }} }]
}
}
]
}
}
}
我们现在需要获得不同的名字......我们只需要1个Jason或1个Susan等。我们如何对" name"现场仍然过滤上述生日?我试过了:
{
"query": {
"bool": {
"should": [
{
"bool": {
"must_not": [
{
"exists": {
"field": "birthday"
}
}
]
}
},
{
"bool": {
"filter": [
{
"range": {
"birthday": {
"lte": 19630301
}
}
}
]
}
}
]
}
},
"aggs": {
"uniq_gender": {
"terms": {
"field": "name"
}
}
},
"from": 0,
"size": 25
}
但只是获得重复的Jasons和Susans的结果。在底部,它将告诉我有10个Susans和12个Jasons。不知道如何获得独特的。
编辑:
我的映射非常简单。名称字段不需要是关键字...可以是文本或其他任何内容,因为它只是在查询中返回的字段。
{
"mappings": {
"birthdays": {
"properties": {
"name": {
"type": "keyword"
},
"birthday": {
"type": "date",
"format": "basic_date"
}
}
}
}
}
答案 0 :(得分:1)
在不知道您的映射的情况下,我猜测您的字段name
未经过分析,无法正确用于术语聚合。
我建议你使用过滤聚合:
{
"aggs": {
"filtered_employes": {
"filter": {
"bool": {
"must": [
{
"bool": {
"must_not": [
{
"exists": {
"field": "birthday"
}
}
]
}
},
{
"range": {
"birthday": {
"lte": 19630301
}
}
}
]
}
},
"aggs": {
"filtered_employes_by_name": {
"terms": {
"field": "name"
}
}
}
}
}
}
另一方面,您的查询不正确您应用should
布尔过滤器。将其更改为must
,汇总将仅返回具有(缺少生日)和(在日期之前出生)的雇员的结果。