按"输入值"列表位置排序



我需要构建弹性搜索查询,并按数组中的字段值定位进行排序。

与 MySQL 类似:

SELECT * FROM `comments` ORDER BY FIELD(`id`,'17','3','5','12') DESC, id DESC;

或邮寄:

SELECT * FROM comments
LEFT JOIN unnest('{12,5,3,17}'::int[]) WITH ORDINALITY t(id, ord) USING (id) ORDER  BY t.ord, id DESC;

您正在 elasticsearch 中寻找自定义排序
可以通过无痛脚本实现它
这是我所做的

PUT my_test
{
"mappings": {
"properties": {
"animal": {
"type": "keyword"
}
}
}
}

填充文档

POST my_test/_doc
{
"animal": "mouse"
}
POST my_test/_doc
{
"animal": "cat"
}
POST my_test/_doc
{
"animal": "dog"
}

自定义排序

GET my_test/_search
{
"query": {
"match_all": {}
},
"sort": {
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": "if(params.scores.containsKey(doc['animal'].value)) { return params.scores[doc['animal'].value];} return 100000;",
"params": {
"scores": {
"dog": 0,
"cat": 1,
"mouse": 2
}
}
},
"order": "asc"
}
}
}

只是为了赞美上面的答案。

您可以组合该方法将某些项目提升到顶部,并保持按搜索结果中所有其他项目的相关性进行原点排序。

"sort": {
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": "if(params.scores.containsKey(doc['sku'].value)) { return params.scores[doc['sku'].value];} return 10",
"params": {
"scores": {
"3JK76": 0,
"8UF78": 1
}
}
},
"order": "asc"
},
"_score": { "order": "desc" }
}

最新更新