我一直在想如何做到这一点,但是无法提出解决方案。希望堆栈可以提供帮助。
我遇到一种情况(标识符称为对象ID-OID)是
1)用于跟踪交易链; 2)不能保证在5分钟间隔内唯一。
用英语“我要获取所有以下文档:(具有时间x和y之间的数据的oid1)或(具有时间w和z之间的数据的oid2)或....”
因为我要处理大量数据(并且希望避免对每个OID进行1次查询),所以我想做的是获取OID列表,为每个OID设置时间限制,然后在以下位置查询ES一旦。我以为我可以做的是:
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"oid": "12ac419512ac4195"
},
"range": {
"startTime": {
"from": "2019-01-04T21:31:00.000Z",
"to": "2019-01-04T21:34:00.000Z"
}
}
},
{
"match_phrase": {
"oid": "34df261834df2618"
},
"range": {
"startTime": {
"from": "2019-01-04T21:35:00.000Z",
"to": "2019-01-04T21:40:00.000Z"
}
}
}
],
"minimum_should_match": 1
}
}
}
只要我删除时间(“我想获取oid1或oid2或oid2”),此方法就可以正常工作,但是在时间范围内,似乎让ES不满意。
有没有办法做到这一点?还是我每个OID只能执行一个查询。
答案 0 :(得分:0)
您需要bool + must子句的另一个子级别才能将match +范围绑定在一起。
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"match_phrase": {
"oid": "12ac419512ac4195"
}
},
{
"range": {
"startTime": {
"from": "2019-01-04T21:31:00.000Z",
"to": "2019-01-04T21:34:00.000Z"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"match_phrase": {
"oid": "34df261834df2618"
}
},
{
"range": {
"startTime": {
"from": "2019-01-04T21:35:00.000Z",
"to": "2019-01-04T21:40:00.000Z"
}
}
}
]
}
}
]
}
}
}