elasticsearch - ElasticSearch:查询今天是否在列表中的开始日期和结束日期之间
问题描述
如果我有一些包含多组开始/结束日期的字段的数据.. 例如:
{
id: 1,
title: "My Title",
availability[{start: 01-01-2020, end: 01-05-2020},{start: 02-01-2020, end: 02-22-2020}]
}
在弹性搜索中是否可以构建查询以检查今天(或任何给定日期)是否属于列表中的任何开始/结束日期组合?
或者我是否需要以不同的方式构建我的数据以使其工作?
以前,我只处理一个开始日期和一个结束日期,并且可以将它们存储为自己的字段并执行 gte、lte 组合来检查。
更新:
如果我将它们添加为嵌套字段。例如:
"avails" : {
"type" : "nested",
"properties" : {
"availStart" : { "type" : "date" },
"availEnd" : { "type" : "date" }
}
}
如果我这样搜索:
{
"query": {
"nested" : {
"path" : "avails",
"query" : {
"term" : {
{ "range" : {"avails.start" : {"lte": "now"}}},
{ "range" : {"avails.end" : {"gt" : "now"}}}
}
}
}
}
}
它会为每个嵌套记录评估这个并返回任何具有匹配子记录的父记录吗?
解决方案
很高兴您选择了nested
字段。现在您只需要确保映射、字段名称和查询都是一致的。
- 日期映射包括
format
:
PUT myindex
{
"mappings": {
"properties": {
"avails": {
"type": "nested",
"properties": {
"start": { "type": "date", "format": "MM-dd-yyyy" },
"end": { "type": "date", "format": "MM-dd-yyyy" }
}
}
}
}
}
- 同步您的文档
POST myindex/_doc
{
"id": 1,
"title": "My Title",
"avails": [
{
"start":"01-01-2020",
"end": "01-05-2020"
},
{
"start": "02-01-2020",
"end": "02-22-2020"
}
]
}
- 最后是查询。你的格式不正确——如果你想要一个逻辑 AND,你需要将
range
查询包装在一个bool
+中must
:
POST myindex/_search
{
"query": {
"nested": {
"path": "avails",
"query": {
"bool": {
"must": [
{ "range" : {"avails.start" : {"lte": "now"}}},
{ "range" : {"avails.end" : {"gt" : "02-01-2020"}}}
]
}
}
}
}
}
推荐阅读
- python - 网站抓取时的 HTML 源代码似乎不一致
- apache - Apache 服务器将我带到错误的 URL 但仅针对一个链接
- java - 在java中,如何处理最多N个线程的有界队列中的项目,N可调?
- swift - 闭包表达式未使用 swift 3
- sql-server-2008 - 在 SQL Server 中合并两行
- github - 用 Webhooks 替换 Github 电子邮件服务
- xpath - Xpath获取省略子节点的主要段落文本
- python-3.x - 如果任何列中的值介于两个值之间,则选择 DataFrame 中的行
- c++ - 从 QMap 获取 Java 风格的迭代器
不指定 T, K - java - 如何使用java存储或以任何方式连接到mysql数据库