2016-12-07 11 views
1

私は商品をリストするeコマースサイトを持っています。リストは、名前、ブランドまたは価格でソートすることができます。最初に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 

私はマルチレベルソートを行うことができます。私はこれがソートの問題であり、別の機能ではないと仮定しました。だから私は並べ替えを探している用語のリストの一部が最初に表示され、次に2番目のレベル私はすでに働いている価格で並べ替えを使用することができます。誰も私が探しているものに私を指摘できますか?

答えて

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を増やしているのは、基本クエリーがフィルタリングしてからおそらく返されないということです。しかし、これは試してみる必要があります:) –

関連する問題