需要您的帮助才能了解基于弹性搜索脚本的排序行为。
首先让我粘贴我的elasticsearch类型的映射:
{
"nestedDateType" : {
"properties" : {
"message" : {
"properties" : {
"date" : {
"type" : "date",
"format" : "dateOptionalTime"
}
}
}
}
},
"nonNestedDateType" : {
"properties" : {
"date" : {
"type" : "date",
"format" : "dateOptionalTime"
}
}
}
}
现在我要做的是查询这两种类型并根据日期排序。 问题出在nestedDateType中,日期路径为“message.date”,其中在nonNestedDateType中,日期路径为“date”。
我知道我必须使用基于脚本的排序来执行此操作。但是,我制作的脚本没有按预期工作。这是我试过的查询:
POST http://locahost:9200/index/nonNestedDateType,nestedDateType/_search?size=5000
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"or": [
{
"range": {
"date": {
"gte": "2015-04-01"
}
}
},
{
"range": {
"message.date": {
"gte": "2015-04-01"
}
}
}
]
}
]
}
}
}
},
"sort": {
"_script": {
"script": "doc.containsKey('message') ? doc.message.date.value : doc.date.value",
"type": "number",
"order": "desc"
}
}
}
这些是我得到的结果:
{
"took": 60,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 15,
"max_score": null,
"hits": [
{
"_index": "***",
"_type": "nonNestedDateType",
"_id": "***",
"_score": null,
"_source": {
"docId": "***",
"date": 1461634484557
},
"sort": [
1461634484557
]
},
{
"_index": "***",
"_type": "nonNestedDateType",
"_id": "***",
"_score": null,
"_source": {
"docId": "***",
"date": 1461634483528
},
"sort": [
1461634483528
]
},
{
"_index": "***",
"_type": "nestedDateType",
"_id": "***",
"_score": null,
"_source": {
"docId": "***",
"message": {
"date": 1461548078310
}
},
"sort": [
0
]
}
]
}
}
从nesteddateType类型的最后一个结果可以看出,我期待sort = 1461548078310而不是0.有人能解释一下我做错了什么吗?
注意到某些字段已被删除以保密。
答案 0 :(得分:0)
我终于可以通过改变
使其有效script": "doc.containsKey('message') ? doc.message.date.value : doc.date.value"
进入
script": "doc.date.value == 0 ? doc['message.date'].value : doc.date.value"
仍然好奇,为什么doc.containsKey(' message')永远不会返回true