2016-08-11 8 views
1

私は、一致タグの数によってソートされたすべての文書を取得したいと思い3個のタグを与えられた今、このような構造を持つ文書ソート

{ 
    "name": "Foo Bar", 
    "myTags": [ 
    { 
     "id": 3, 
     "name": "My tag 1" 
    }, 
    { 
     "id": 5, 
     "name": "My Tag 5" 
    }, 
    { 
     "id": 7, 
     "name": "My Tag 7" 
    } 
    ] 
} 

に弾を入力し、しました。最初に、2つのタグに一致するものと3つのタグのすべてにマッチする文書。

どうすればいいですか?

+0

をあなたはこの得点を使用し、 '3(3タグ)で得点を増加しますshould'文を' bool'を使用する場合は、1つのタグ「マッチ」(あなたのユースケースで意味することは何でも)。アイデアは、1つのタグが一致するとスコアが増加するということです。 –

答えて

0

あなたはfunction_scoreでそれを行うことができます。

{ 
    "query": { 
    "function_score": { 
     "query": { 
     "match_all": {} 
     }, 
     "functions": [ 
     { 
      "filter": { 
      "nested": { 
       "path": "myTags", 
       "query": { 
       "term": { 
        "myTags.name": "My Tag 1" 
       } 
       } 
      } 
      }, 
      "weight": 1 
     }, 
     { 
      "filter": { 
      "nested": { 
       "path": "myTags", 
       "query": { 
       "term": { 
        "myTags.name": "My Tag 5" 
       } 
       } 
      } 
      }, 
      "weight": 1 
     }, 
     { 
      "filter": { 
      "nested": { 
       "path": "myTags", 
       "query": { 
       "term": { 
        "myTags.name": "My Tag 7" 
       } 
       } 
      } 
      }, 
      "weight": 1 
     } 
     ], 
     "boost_mode": "sum", 
     "score_mode": "sum" 
    } 
    } 
} 
+0

私はElastic 1.7.5を使用していることを忘れていました。このクエリは大丈夫ですか? – Hpatoio

+0

1.7で動作するはずです。アイデアは、文書がタグの1つと一致する場合、スコアは+1を取得するということです。別のタグと一致する場合は+1、そうでない場合は+1などです。基本的に、最終スコアは一致するタグの数+1(デフォルトの 'match_all'デフォルトクエリから)です。 –

+0

私は 'weight:1'を' weight:2'に変更しなければならなかった。そうでなければ、1つのタグだけをフィルタリングするときに奇妙な/間違った結果を得ていた。 – Hpatoio