【发布时间】:2018-03-20 13:54:06
【问题描述】:
我使用的是相当旧的 elasticsearch 2.5。我在每个文档中都有酒店的可用性信息。有一个字段叫做“availabilities”,其映射如下:
"availabilities":{
"type": "nested",
"dynamic": "strict",
"properties": {
"start": { "type": "date", "format": "yyyy-MM-dd" },
"end": { "type": "date", "format": "yyyy-MM-dd" }
}
}
其中一个示例文档(剥离版)如下:
{
"name": "Seaside hotel",
"availabilities": [
{
"start": "2018-03-01",
"end": "2018-10-01"
},
{
"start": "2018-10-04",
"end": "2018-10-04"
},
{
"start": "2018-10-06",
"end": "2018-10-06"
},
{
"start": "2018-10-08",
"end": "2018-10-17"
},
{
"start": "2018-10-21",
"end": "2018-10-28"
},
{
"start": "2018-10-30",
"end": "2018-10-31"
},
{
"start": "2018-11-03",
"end": "2018-11-10"
},
{
"start": "2018-11-13",
"end": "2019-03-01"
},
{
"start": "2019-03-04",
"end": "2019-03-04"
},
{
"start": "2019-03-06",
"end": "2020-02-29"
}
]
}
我正在尝试查找所有这些酒店的文档,该文档可从"2018-10-01" (YYYY-MM-DD) to "2018-10-10" 获得。我的搜索查询如下:
开始和结束日期以毫秒为单位比较1539154800000 milliseconds = 2018-10-10 and 1538377200000 = 2018-10-01
GET hotels/_search
{
"query": {
"filtered": {
"filter": {
"query": {
"bool": {
"must": [{
"nested": {
"query": {
"bool": {
"must": [{
"script": {
"script": "return (doc['availabilities.end'].date.getMillis() <= 1539154800000 && doc['availabilities.start'].date.getMillis() >= 1538377200000)"
}
}]
}
},
"path": "availabilities"
}
}],
"must_not": null
}
}
}
}
}
}
当我运行这个查询时,我最终在结果集中得到了上面的“Seaside hotel”,虽然它不应该在那里,因为它在 2018 年 10 月 1 日到 2018 年 10 月之间没有任何可用性- 10.
现在我将查询更改为不使用脚本,在这里我正在搜索从 2018 年 10 月 9 日到 2018 年 10 月 16 日有空房的酒店
GET hotels/_search
{
"query": {
"filtered": {
"filter": {
"query": {
"bool": {
"must": [{
"nested": {
"query": {
"bool": {
"must": [{
"range": {
"availabilities.end": {
"gte": "2018-10-16"
}
}
}, {
"range": {
"availabilities.start": {
"lte": "2018-10-09"
}
}
}]
}
},
"path": "availabilities"
}
}],
"must_not": null
}
}
}
}
}
}
这个查询应该在结果中给我带来了“Seaside hotel”文档,因为它在每个搜索日期都有空房,但搜索没有给我这家酒店。
我的全部目的是查询用户在指定可用性日期搜索酒店。知道我做错了什么或如何实现我的目标吗?
【问题讨论】:
标签: elasticsearch elasticsearch-2.0 elasticsearch-query