json - 使用连接参数的Elasticsearch存储桶聚合

标签 json elasticsearch

我正在使用Elasticsearch API和文档的架构,如下所示

{
  name: "",
  born_year: "",
  born_month: "",
  born_day: "",
  book_type: "",
  price: <some number>,
  country: ""
}

现在,我需要获取每个在1995年之前出生的名字的文档计数(born_year + born_month + born_day <“20051220”)。我该如何实现?

我尝试了这个:
{
  "query": {
    "query_string": {
      "query": "country:\"SL\""
    }
  },
  "size": 0,
  "aggs": {
    "total": {
      "terms": {
        "field": "name"
      }
    }
  }
}

但是我不知道如何为生日添加过滤器。

最佳答案

如@val所述,您需要添加一个实际日期字段,可以通过在创建时将这三个字段串联起来轻松添加。
但是,您如何根据日期范围进行过滤,有两种方法,两种方法都会返回不同的结果集
现在,您可以选择过滤级别。

您提到在国家/地区字段上进行查询。但是您没有提到要在什么级别上过滤日期范围。对于这两种情况,我都会给您查询。

映射-假设您创建日期字段。

{
    name:"",
    born_year:"",
    born_month:"",
    born_day:"",
    book_type:"",
    price:<some number>,
    country:"",
    date : ""
  }

情况-1)仅过滤名称集合的日期范围,此处的文件计数不受日期范围过滤器的影响
{
    "query": {
        "query_string": {
            "query": "country:\"SL\""
        }
    },
    "aggs": {
        "total": {
            "filter": {
                "range": {
                    "date": {
                        "gte": "your_date_mx",
                        "lte": "your_date_min"
                    }
                }
            },
            "aggs": {
                "NAME": {
                    "terms": {
                        "field": "name",
                        "size": 10
                    }
                }
            }
        }
    }
}

情况2)在这种情况下,由于我们在查询级别添加了日期范围过滤器,因此您的文档计数和汇总都将针对日期范围进行过滤。
{
    "query": {
        "query_string": {
            "query": "country:\"SL\""
        },
        "bool": {
            "must": [
                {
                    "range": {
                        "date": {
                            "gte": "your_date_mx",
                            "lte": "your_date_mic"
                        }
                    }
                }
            ]
        }
    },
    "aggs": {
        "toal": {
            "terms": {
                "field": "name",
                "size": 10
            }
        }
    }
}

因此,向聚合添加过滤器将仅影响aggs计数。
编辑-
使用groovy脚本的Approach1)尝试将字符串压缩并解析为整数,然后与您的输入日期进行比较。
{
    "query": {
        "bool": {
            "must": [
                {}
            ],
            "filter": {
                "script": {
                    "script": {
                        "inline": "(doc['year'].value  +  doc['month'].value + doc['date'].value).toInteger() > 19910701",
                        "params": {
                            "param1": 19911122
                        }
                    }
                }
            }
        }
    }
}

确保在索引索引日期(或月份)时用一位数字表示,例如6如06

2)方法2-解析字符串的确切日期(首选)
{
    "query": {
        "bool": {
            "must": [
                {}
            ],
            "filter": {
                "script": {
                    "script": {
                        "inline": "Date.parse('dd-MM-yyyy',doc['date'].value  +'-'+  doc['month'].value +'-'+ doc['year'].value).format('dd-MM-yyyy') > param1",
                        "params": {
                            "param1": "04-05-1991"
                        }
                    }
                }
            }
        }
    }
}

第二种方法是更好的方法,因为您不必担心每个字段(日期,月,日)的字符串维护,以后再解析为适当的int进行比较。

关于json - 使用连接参数的Elasticsearch存储桶聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41356852/

相关文章:

java - 更改现有应用程序的 admob id

elasticsearch - 是否存在一些介绍gc日志的官方文件?

elasticsearch - 通过Logstash过滤器清理日志

ElasticSearch 匹配具有不同值的多个字段

java - 从 RESTful API 中提取数据以解析为 json 并从 JAVA 中提取数据

ios - YouTube API/JSON/swift

android - 专门使用 GraphQl 解析 JSON 数据

elasticsearch - Elasticsearch,Kibana分类/汇总文档

Elasticsearch - 如何删除文档列表?

jquery - 在 jQuery 中,我在 JSON 结果中返回 HTML,我必须转义什么?