elasticsearch - Elasticsearch:开始和结束日期列表中的匹配范围
问题描述
我想要实现的是仅在查询中提供的日期在 1 个单周期范围内时才返回结果。现在我有一个部分有效的查询,但它查询可用性列表中的所有时间段。它匹配是因为在某处存在低于或等于的开始日期2020-12-25T00:00:00
并且在某处存在大于或等于的结束日期2020-12-22T00:00:00
。
我想要的是与下面提供的文档不匹配的查询,因为两个句点都不匹配我输入的查询。
这是我的数据模型的一部分:
{
"units": [
{
"availability": [
{
"period": [
{
"start": "2020-09-12T00:00:00",
"end": "2020-10-31T00:00:00"
}
]
},
{
"period": [
{
"start": "2021-04-03T00:00:00",
"end": "2021-04-24T00:00:00"
}
]
}
]
}
]
}
这是我现在的 Elasticsearch 查询:
{
"query": {
"bool": {
"must": [
{
"range": {
"units.availability.period.start": {
"lte": "2020-12-25T00:00:00"
}
}
},
{
"range": {
"units.availability.period.end": {
"gte": "2020-12-22T00:00:00"
}
}
}
]
}
}
}
任何建议都会有很大帮助!
解决方案
我怀疑这availability
需要nested
——否则你的数组对象的值会变平start
,你的 s & s之间的连接end
就会丢失。
简而言之,删除索引,更改映射,重新索引,然后使用类似的东西
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "units.availability",
"query": {
"bool": {
"must": [
{
"range": {
"units.availability.period.start": {
"lte": "2020-12-25T00:00:00"
}
}
},
{
"range": {
"units.availability.period.end": {
"gte": "2020-12-22T00:00:00"
}
}
}
]
}
}
}
}
]
}
}
}
顺便说一句,您可能还想考虑让units
自己nested
——它们也看起来像独立的实体!
推荐阅读
- javascript - 制作带有过渡的动画菜单?
- jquery - 在引导模式中加载内容
- java - StreamTokenizer 如何在行尾既是 CR 又是 LF 或组合的情况下工作?
- c++ - 为什么指针返回字符串而不是第一个字符,因为指针仅存储第一个字符的地址?
- jenkins - 有没有使用 API 复制 Jenkins Job 和 Builds 的方法?
- drake - 在 Drake 的上下文中理解状态组
- c++ - CMake没有找到明显存在的包
- node.js - createReactionCollector 未触发
- api-platform.com - ApiPlatform 实体关系 iri 和 schema
- c - C - 努力理解如何在 if/while 循环中使用 int 函数