Sorting Elasticsearch不带脚本的自定义分类排序
我在ElasticSearch中的文档中有一个分类字段(我们称之为Sorting Elasticsearch不带脚本的自定义分类排序,sorting,elasticsearch,groovy,Sorting,elasticsearch,Groovy,我在ElasticSearch中的文档中有一个分类字段(我们称之为political_party),我想实现以下排序算法: 如果政党是D或R,则放入第一桶。如果是G,它们应该都在末尾 在这两个存储桶中,结果应按注册日期排序 我知道可以这样做: { "sort": [ { "_script": { "script": "doc['political_party'].value == 'G' ? 0 : 1",
political_party
),我想实现以下排序算法:
政党
是D
或R
,则放入第一桶。如果是G
,它们应该都在末尾{
"sort": [
{
"_script": {
"script": "doc['political_party'].value == 'G' ? 0 : 1",
"type": "number",
"order": "desc"
}
},
{
"date_registered": {
"order": "desc"
}
}
]
}
{
"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"
}
}
]
}
}
}
但是,由于运行脚本所需的配置以及托管ElasticSearch供应商的一些限制,我需要使用
\u script
字段在不使用\u script的情况下执行此操作。如何做到这一点?由于默认排序是在\u score
字段上完成的,因此您可以使用计算自定义分数以匹配上述约束。不需要脚本
其主要思想是为所有political\u party
为D
或R
的文档赋予2的权重(并为G
保留默认权重1),然后只需根据其注册日期字段为每个文档打分
它是这样的:
{
"sort": [
{
"_script": {
"script": "doc['political_party'].value == 'G' ? 0 : 1",
"type": "number",
"order": "desc"
}
},
{
"date_registered": {
"order": "desc"
}
}
]
}
{
"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
文档将向下冒泡。所有脚本都将根据其注册日期字段进行排序。您可以将脚本放入文件中。这样,您就不必启用ScriptingHanks。问题是我实际上也在用其他东西计算分数,所以我不确定我能不能做到这一点;这是一个简化的示例,但该示例有所帮助。如果您需要根据其他约束计算自己的自定义分数,function\u score
正是解决方法,这个答案中还缺少什么?