2016-12-07 52 views
1

我收到了一个电子商务网站,其中列出了产品。该列表可以按名称,品牌或价格排序。按条目列表排序首先使用ElasticSearch

现在我想提供一个功能,用户可以在其中定义首选品牌列表。这些品牌应该首先显示在列表的顶部,与其他排序参数无关。用户喜欢'SRAM'和'Shimano'品牌。按价格排序的查询示例如下所示:

<Brand> <Price(desc)> 
SRAM  99.00 
Shimano 95.00 
SRAM  87.50 
SRAM  67.90 
Shimano 59.90 
AVID  125.90 
RaceFace 115.90 
ENVE  70.00 
RaceFace 63.60 

我知道我可以进行多级排序。我认为这是一个排序问题,而不是另一个功能。所以我正在寻找一种排序方式,其中一部分条款将首先显示,然后第二级我可以使用价格排序,我已经工作。任何人都可以指出我称之为什么?

回答

1

您可以使用function score

GET /_search 
{ 
    "query": { 
     "function_score": { 
      "query": { "match_all": {} }, 
      "boost": "5", 
      "functions": [ 
       { 
        "filter": { "match": { "BRAND": "Sram" } }, 
        "weight": 2 
       }, 
       { 
        "filter": { "match": { "BRAND": "shimano" } }, 
        "weight": 3 
       } 
      ], 
      "score_mode": "max", 
      "boost_mode": "multiply", 
     } 
    } 
} 
+0

谢谢你,这显然是做它的方式。我可以在'function_score'包装中使用我现有的查询吗? –

+0

@JanDetlefsen当然你可以做到这一点 –

+0

@JanDetlefsen但是,可能有一个诀窍是提升文档,它们必须通过查询返回。我的意思是,例如,如果你的查询是按品牌过滤:“stackoverflow”,但你是提高sram和shimano他们可能不会返回,因为基本查询过滤它们。但是,这个你应该尝试:) –