我在ElasticSearch的文档中有一个分类字段(让我们称之为var m=(document.compatMode == 'CSS1Compat') ? 'Standards' : 'Quirks'; window.alert(m+'-mode.');
),我想实现以下排序算法:
political_party
为political_party
或D
,请填入第一个存储桶。如果它是R
,那么它们应该全部结束。G
排序。我知道这可以这样做:
date_registered
但是,由于脚本运行所需的配置以及我们托管的ElasticSearch供应商提供的一些限制,我需要使用{
"sort": [
{
"_script": {
"script": "doc['political_party'].value == 'G' ? 0 : 1",
"type": "number",
"order": "desc"
}
},
{
"date_registered": {
"order": "desc"
}
}
]
}
字段不使用执行此操作。怎么办呢?
答案 0 :(得分:0)
由于默认排序是在_score
字段上完成的,因此您可以使用function_score
query计算自定义分数以匹配上述约束。无需编写脚本。
主要思想是对political_party
为D
或R
的所有文档赋予权重2(并为G
保留默认权重1)然后根据其date_registered
字段对每个文档进行评分。
会是这样的:
{
"query": {
"function_score": {
"boost_mode": "replace",
"functions": [
{
"filter": {
"terms": {
"political_party": [
"D",
"R"
]
}
},
"weight": 2
},
{
"field_value_factor": {
"field": "date_registered",
"factor": 1,
"modifier": "none"
}
}
]
}
}
}
通过此查询,所有D
和R
文档都会冒泡到顶部,G
文档将会关闭。所有内容都将根据date_registered
字段进行排序。