我正在尝试将以下逻辑作为Java中的查询写到elasticsearch:
ES包含以下文档:
{"request" : 1, "store":"ebay", "status" : "retrieved" , "lastdate": "2012/12/20 17:00", "retrieved_by" : "John"}
{"request" : 1, "store":"ebay", "status" : "stored" , "lastdate": "2012/12/20 18:00", "stored_by" : "Alex"}
{"request" : 1, "store":"ebay", "status" : "bought" , "lastdate": "2012/12/20 19:00", "bought_by" : "Arik"}
{"request" : 2, "store":"aliexpress", "status" : "retrieved" , "lastdate": "2012/12/20 17:00"}
{"request" : 2, "store":"aliexpress","status" : "stored" , "lastdate": "2012/12/20 18:00"}
{"request" : 2, "store":"aliexpress","status" : "bought" , "lastdate": "2012/12/20 19:00"}
我正在尝试编写一个查询,该查询将获取商店名称作为输入,并返回通过其request_id汇总到数组中的该商店的请求。
换句话说,我正在尝试:
1.按条款对特定字段(“商店”)进行过滤。
2.将基于特定字段(“请求”)的结果汇总到一个数组中
例如,输入“ ebay”:
{
"1" : [
{"request" : 1, "store":"ebay", "status" : "retrieved" , "lastdate": "2012/12/20 17:00", "retrieved_by" : "John"}
{"request" : 1, "store":"ebay", "status" : "stored" , "lastdate": "2012/12/20 18:00", "stored_by" : "Alex"}
{"request" : 1, "store":"ebay", "status" : "bought" , "lastdate": "2012/12/20 19:00", "bought_by" : "Arik"}
],
".." : [...]
}
它并不重要,结果中的密钥将是请求(我将购买任何密钥)。重要的部分是我将请求字段中的所有记录聚合到一个数组中,并按lastdate在数组中对它们进行排序。
我的最终目标是使用java QueryBuilder创建此查询。因此,我首先尝试使用弹性本机查询语言,以便了解要使用的QueryBuilder。
设置基本映射:
PUT stores
{
"mappings": {
"properties": {
"lastdate": {
"type": "date",
"format": "yyyy/MM/dd HH:mm"
}
}
}
}
同步一些文档:
POST _bulk
{"index":{"_index":"stores","_type":"_doc"}}
{"request":1,"store":"ebay","status":"retrieved","lastdate":"2012/12/20 17:00","retrieved_by":"John"}
{"index":{"_index":"stores","_type":"_doc"}}
{"request":1,"store":"ebay","status":"stored","lastdate":"2012/12/20 18:00","stored_by":"Alex"}
{"index":{"_index":"stores","_type":"_doc"}}
{"request":1,"store":"ebay","status":"bought","lastdate":"2012/12/20 19:00","bought_by":"Arik"}
{"index":{"_index":"stores","_type":"_doc"}}
{"request":2,"store":"aliexpress","status":"retrieved","lastdate":"2012/12/20 17:00"}
{"index":{"_index":"stores","_type":"_doc"}}
{"request":2,"store":"aliexpress","status":"stored","lastdate":"2012/12/20 18:00"}
{"index":{"_index":"stores","_type":"_doc"}}
{"request":2,"store":"aliexpress","status":"bought","lastdate":"2012/12/20 19:00"}
过滤查询,然后按request
字段进行汇总并使用sorted top_hits
:
GET stores/_search
{
"size": 0,
"query": {
"term": {
"store": {
"value": "ebay"
}
}
},
"aggs": {
"by_req": {
"terms": {
"field": "request"
},
"aggs": {
"hits": {
"top_hits": {
"sort": [
{
"lastdate": {
"order": "desc"
}
}
]
}
}
}
}
}
}
将其转换为Java DSL并不难。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句