Mysql 使用Elasticsearch 5按特定值排序或排序
试图找出如何对elasticsearch结果进行排序,以便始终首先显示具有特定值的字段。在这种情况下,我希望在显示类别页面时首先显示特定的SKU(我使用bool查询为类别页面生成elasticsearch结果) 如果我想用MySQL实现这一点,我会使用case语句:Mysql 使用Elasticsearch 5按特定值排序或排序,mysql,
elasticsearch,Mysql,
elasticsearch,试图找出如何对elasticsearch结果进行排序,以便始终首先显示具有特定值的字段。在这种情况下,我希望在显示类别页面时首先显示特定的SKU(我使用bool查询为类别页面生成elasticsearch结果) 如果我想用MySQL实现这一点,我会使用case语句: ORDER BY CASE sku WHEN 'sku1' then 1 WHEN 'sku2' then 2 WHEN 'sku3' then 3 ELSE 4 END 此查询执行以下操作: { "sort" :
ORDER BY CASE sku
WHEN 'sku1' then 1 WHEN 'sku2' then 2 WHEN 'sku3' then 3 ELSE 4 END
此查询执行以下操作:
{
"sort" : [
{
"_script": {
"type": "number",
"script": {
"inline" : "params.sortOrder.indexOf(doc['skuid_text'].value)",
"params": {
"sortOrder": [
"SKUID1",
"SKUID2",
"SKUID3"
]
}
},
"order": "asc"
}
}
],
"query" :{
"bool" : {
"must" : [
{
"term" : {
"category_codes" : "CATEGORY1"
}
}
]
}
}
}
但它返回“-1”作为所有记录的排序值,例如:
sort": [
-1
]
注意:“skuid_text”是我分析为“关键字”类型的SKU字段。我已经尝试了doc['skuid_text'].value和doc['skuid_text'],并且我已经验证了“sortOrder”数组中的SKU肯定包含在结果集中
我错过了什么?或者,有没有一种完全不同的方法来解决这个问题?事实上,原始查询做了一些工作,只是我用“asc”排序的方式将排序器阵列中的所有SKU推到了最后 如果在sortOrder中颠倒SKU的顺序并对其进行一些计算,它将正确排序。不过有点老套。我很想知道是否有更好的方法可以让任何人想到
{
"sort" : [
{
"_script": {
"type": "number",
"script": {
"inline" : "(9999)-params.sortOrder.indexOf(doc['skuid_text'].value)",
"params": {
"sortOrder": [
"SKUID3",
"SKUID2",
"SKUID1"
]
}
},
"order": "asc"
}
}
],
"query" :{
"bool" : {
"must" : [
{
"term" : {
"category_codes" : "CATEGORY1"
}
}
]
}
}
}
实际上,最初的查询确实起到了一定的作用,只是我用“asc”排序的方式将排序器数组中的所有SKU推到了最后 如果在sortOrder中颠倒SKU的顺序并对其进行一些计算,它将正确排序。不过有点老套。我很想知道是否有更好的方法可以让任何人想到
{
"sort" : [
{
"_script": {
"type": "number",
"script": {
"inline" : "(9999)-params.sortOrder.indexOf(doc['skuid_text'].value)",
"params": {
"sortOrder": [
"SKUID3",
"SKUID2",
"SKUID1"
]
}
},
"order": "asc"
}
}
],
"query" :{
"bool" : {
"must" : [
{
"term" : {
"category_codes" : "CATEGORY1"
}
}
]
}
}
}
这个插件做了你需要的这个插件做了你需要的