2016-11-26 467 views
0

试图找出如何对elasticsearch结果进行排序,以便具有特定值的字段始终首先显示。在这种情况下,我希望特定的SKU在显示类别页面时首先显示(我使用bool查询生成类别页面的弹性搜索结果)。使用Elasticsearch对特定值进行排序或排序5

如果我试图用MySQL来做到这一点,我会使用case语句:

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肯定包含在结果集中。

我缺少什么?或者,有没有一种完全不同的方法来解决这个问题?

回答

0

实际上,原始查询确实是一种工作,只是我用“asc”命令的方式是将sortOrder数组中的所有skus推到最后。

如果您在sortOrder中颠倒skus的顺序并对它进行一些运算,它将会正确排序。尽管有点黑客。我很想知道任何人都能想到更好的方法。

{ 
    "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" 
        } 
       } 
      ] 
     } 
    } 
} 
相关问题