Elassandra/Elastic 搜索中的聚合、日期范围查询
Aggregation, Date range query in Elassandra/Elastic Search
在日期范围聚合索引上搜索时得到不同的结果。
创建如下索引。
curl -XPUT -H 'Content-Type: application/json' 'http://x.x.x.x:9200/date_index' -d '{
"settings" : { "keyspace" : "keyspace1"},
"mappings" : {
"table1" : {
"discover":"sent_date",
"properties" : {
"sent_date" : { "type": "date", "format": "yyyy-MM-dd HH:mm:ssZZ" }
}
}
}
}'
尝试使用以下代码进行搜索时,我得到了不同日期范围的结果。
curl -XGET -H 'Content-Type: application/json' 'http://x.x.x.x:9200/date_index/_search?pretty=true' -d '
{
"aggs" : {
"sentdate_range_search" : {
"date_range" : {
"field" : "sent_date",
"time_zone": "UTC",
"format" : "yyyy-MM-dd HH:mm:ssZZ",
"ranges" : [
{ "from" : "2010-05-07 11:22:34+0000", "to" : "2011-05-07 11:22:34+0000"}
]
}
}
}
}'
示例输出,显示不同的结果,如 2039、2024 等
{
"took" : 26,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 417427,
"max_score" : 1.0,
"hits" : [
{
"_index" : "date_index",
"_type" : "table1",
"_id" : "P89200822_4210021505784",
"_score" : 1.0,
"_source" : {
"sent_date" : "2039-05-22T14:45:39.000Z"
}
},
{
"_index" : "date_index",
"_type" : "table1",
"_id" : "P89200605_4210020537428",
"_score" : 1.0,
"_source" : {
"sent_date" : "2024-06-05T07:20:57.000Z"
}
},
.........
"aggregations" : {
"sentdate_range_search" : {
"buckets" : [
{
"key" : "2010-05-07 11:22:34+00:00-2011-05-07 11:22:34+00:00",
"from" : 1.273231354E12,
"from_as_string" : "2010-05-07 11:22:34+00:00",
"to" : 1.304767354E12,
"to_as_string" : "2011-05-07 11:22:34+00:00",
"doc_count" : 0
}
]
}
}
仅供参考: 我正在使用驻留在 Cassandra 数据库中的数据,其中字段 "sent_date" 以 UTC 时区存储。
请指教,谢谢
== 根据评论中的对话修改答案 ==
聚合不同于搜索查询。聚合沿着指定的维度组合记录(即聚合!)。问题中的查询将两个指定日期之间的记录聚合到一个桶中。有关聚合的更多信息,请参见 the Elasticsearch documentation
由于要求过滤介于两个日期之间的记录,因此日期范围过滤器是合适的方法:
GET date_index/_search
{
"query": {
"bool": {
"filter": {
"range": {
"sent_date": {
"gte": "2010-05-07 11:22:34+0000",
"lte": "2011-05-07 11:22:34+0000"
}
}
}
}
}
}
为什么要过滤而不是常规查询?过滤器比搜索更快,因为它们不会影响文档评分并且可以缓存。您可以组合过滤器和搜索,例如,获取给定时间范围内与短语 "all work and no play makes jack a dull boy."
匹配的所有记录
在日期范围聚合索引上搜索时得到不同的结果。
创建如下索引。
curl -XPUT -H 'Content-Type: application/json' 'http://x.x.x.x:9200/date_index' -d '{
"settings" : { "keyspace" : "keyspace1"},
"mappings" : {
"table1" : {
"discover":"sent_date",
"properties" : {
"sent_date" : { "type": "date", "format": "yyyy-MM-dd HH:mm:ssZZ" }
}
}
}
}'
尝试使用以下代码进行搜索时,我得到了不同日期范围的结果。
curl -XGET -H 'Content-Type: application/json' 'http://x.x.x.x:9200/date_index/_search?pretty=true' -d '
{
"aggs" : {
"sentdate_range_search" : {
"date_range" : {
"field" : "sent_date",
"time_zone": "UTC",
"format" : "yyyy-MM-dd HH:mm:ssZZ",
"ranges" : [
{ "from" : "2010-05-07 11:22:34+0000", "to" : "2011-05-07 11:22:34+0000"}
]
}
}
}
}'
示例输出,显示不同的结果,如 2039、2024 等
{
"took" : 26,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 417427,
"max_score" : 1.0,
"hits" : [
{
"_index" : "date_index",
"_type" : "table1",
"_id" : "P89200822_4210021505784",
"_score" : 1.0,
"_source" : {
"sent_date" : "2039-05-22T14:45:39.000Z"
}
},
{
"_index" : "date_index",
"_type" : "table1",
"_id" : "P89200605_4210020537428",
"_score" : 1.0,
"_source" : {
"sent_date" : "2024-06-05T07:20:57.000Z"
}
},
.........
"aggregations" : {
"sentdate_range_search" : {
"buckets" : [
{
"key" : "2010-05-07 11:22:34+00:00-2011-05-07 11:22:34+00:00",
"from" : 1.273231354E12,
"from_as_string" : "2010-05-07 11:22:34+00:00",
"to" : 1.304767354E12,
"to_as_string" : "2011-05-07 11:22:34+00:00",
"doc_count" : 0
}
]
}
}
仅供参考: 我正在使用驻留在 Cassandra 数据库中的数据,其中字段 "sent_date" 以 UTC 时区存储。
请指教,谢谢
== 根据评论中的对话修改答案 ==
聚合不同于搜索查询。聚合沿着指定的维度组合记录(即聚合!)。问题中的查询将两个指定日期之间的记录聚合到一个桶中。有关聚合的更多信息,请参见 the Elasticsearch documentation
由于要求过滤介于两个日期之间的记录,因此日期范围过滤器是合适的方法:
GET date_index/_search
{
"query": {
"bool": {
"filter": {
"range": {
"sent_date": {
"gte": "2010-05-07 11:22:34+0000",
"lte": "2011-05-07 11:22:34+0000"
}
}
}
}
}
}
为什么要过滤而不是常规查询?过滤器比搜索更快,因为它们不会影响文档评分并且可以缓存。您可以组合过滤器和搜索,例如,获取给定时间范围内与短语 "all work and no play makes jack a dull boy."
匹配的所有记录