ElasticSearch中的条件排序

时间:2013-09-23 00:30:48

标签: sorting elasticsearch mvel date-sorting

我有一些文件,我想在日期字段上排序。对于日期等于指定日期的文档,今天的示例以及之后的所有日期,我希望按升序排序。对于指定日期之前的日期,我想按降序排序。

这在ElasticSearch中是否可行?如果是这样,你可以建议任何文献或方法。

日期的类型为“日期”,格式为“dateOptionalTime”。

由于

2 个答案:

答案 0 :(得分:14)

是的,这可以在ElasticSearch中使用脚本进行排序或评分。

我的偏好是评分脚本,因为“基于脚本的分数”会更快(根据文档)。

使用评分脚本,您可以将Unix时间戳用于int/long类型的日期字段以及custom_score查询中的mvel排序脚本。您可能需要重新索引文档。您还需要能够将搜索到的时间转换为Unix时间戳,以便在ElasticSearch中进行抽取。

然后,排序脚本将从每个文档的时间戳中扣除所请求的时间戳并创建绝对值。然后结果按升序排序 - 最低'距离'是最好的。

因此,在寻找大约一年前的文件时,它看起来像是:

"query": {
    "custom_score" : {
        "query" : {
            ....
        },
        "params" : {
            "req_date_stamp" : 1348438345,
        },
        "script" : "abs(doc['timestamp'].value - req_date_timestamp)"
    }
},
"sort": {
    "_score": {
        'order': 'asc'
    }
}

(为我的JSON中的任何错误道歉 - 我在pyes测试了这个想法)

您可能需要对此进行调整以使舍入正确 - 例如,您的问题提到匹配日期,因此您可能希望将时间戳生成器舍入到最近的一天。

对于“完整”信息,您可以查看Custom Score Query docs并点击MVEL脚本编写链接。

答案 1 :(得分:3)

对于这种特定用例,您应该使用排序脚本。

参见"基于脚本的排序" Sort documentation页面中的部分。