elasticsearch - 查询 ElasticSearch - 在不同时间匹配的多个术语
问题描述
一直在为如何做到这一点而绞尽脑汁,但无法提出解决方案。希望堆栈可以提供帮助。
我有一个标识符(我们称之为对象 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 一个查询。
解决方案
您需要另一个子级别的 bool + must 子句将匹配 + 范围绑定在一起。
{
"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"
}
}
}
]
}
}
]
}
}
}
推荐阅读
- window - 在 Windows 10 中找不到 Inf2Cat
- swift - 让听众知道何时在 dynamodb 中更新了令人兴奋的项目
- asp.net-core-webapi - LINQ 查询仅选择内部列表(JSON 响应中的问题)
- azure - 如何将标签添加到在 Microsoft Azure 中创建的文件存储、队列存储和表存储
- python - 如何在使用 python 的不同客户的特定月数后计算出平均值?
- json - 带有 GraphQL 解析错误的 Google Apps 脚本 API 请求
- java - 程序计算 1250 小时后的时间?
- javascript - 如何获取作为标头添加的值以响应从服务器到客户端(在 reactjs 中)?
- oracle-apex - 如何获取项目“数据库列”名称
- reactjs - react-router v3 根路由渲染 2 个组件。如何使用 react-router v5 做到这一点?