在ElasticSearch中的条件排序

12

我有一些文档,希望能按日期字段进行排序。对于日期等于特定日期(例如今天)和之后所有日期的文档,我希望按升序排序。对于特定日期之前的日期,我希望按降序排序。

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

日期的类型是"date",格式为"dateOptionalTime"。

谢谢

3个回答

16

在ElasticSearch中,使用脚本可以实现排序或评分的功能。我更倾向于使用评分脚本,因为根据文档,“基于脚本的得分”会更快。

使用评分脚本,您可以将int/long类型的日期字段的Unix时间戳与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中测试了这个想法)

您可能需要调整此内容以获得正确的舍入-例如,您的问题提到匹配天数,因此您可能希望将时间戳生成器舍入到最接近的一天。

有关“完整”信息,您可以查看自定义得分查询文档并转至MVEL脚本的链接。


3

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

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


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}


你的回答非常不清楚,这是在尝试解决问题还是你也遇到了类似的问题? - Ruli
我是指你可以使用should+boost,并按_score排序。 - user3835861
将条件设置为“应该”,如果相等,则增加分数并按分数排序。 - user3835861

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接