12

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

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

date 的类型为“date”,格式为“dateOptionalTime”。

谢谢

4

3 回答 3

15

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

我更喜欢评分脚本,因为“基于脚本的评分”会更快(根据文档)。

使用评分脚本,您可以将 Unix 时间戳用于类型的日期字段,并在查询int/long中使用 mvel 排序脚本。custom_score您可能需要重新索引您的文档。您还需要能够将搜索到的时间转换为 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

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

对于“完整”信息,您可以查看自定义分数查询文档并点击链接到 MVEL 脚本。

于 2013-09-25T08:40:23.017 回答
3

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

请参阅排序文档页面中的“基于脚本的排序”部分。

于 2013-09-23T09:38:41.837 回答
0

我的英语很差。我的解决方案是提升。我的数据是 {"terms_id": [20211011,20211012,20211013,20211014],"sort_value":1} {"terms_id": [20211012,20211013,20211014],"sort_value":2} {"terms_id": [20211013,20211014,20211015],"sort_value":1}

我的查询是 {"bool":{"must":[],"should":[{"bool":{"must":[{"terms":{"terms_id":[20211012],"boost":5}}],"must_not":[]}},{"bool":{"must_not":[{"terms":{"terms_id":[20211012]}}]}}],"minimum_should_match":1}}

我的排序是{"_score":{"order":"desc"},"sort_value":{"order":"desc"}}

结果是{"terms_id": [20211012,20211013,20211014],"sort_value":2} {"terms_id": [20211011,20211012,20211013,20211014],"sort_value":1} {"terms_id": [20211013,20211014,20211015],"sort_value":1}

于 2021-10-25T13:01:57.033 回答