2016-08-11 7 views
1

Ich habe eine Art elastisch mit Dokumenten mit dieser StrukturSortieren nach verschachteltem Feld

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

, jetzt 3-Tags I durch die Anzahl der passenden Tags sortierten alle Dokumente erhalten möchte. Also zuerst die Dokumente, die mit allen 3 Tags übereinstimmen, als die mit 2, dann eins und schließlich keine.

Wie kann ich das tun?

+0

Sie verwenden für das Scoring und verwenden Sie einen 'bool' mit drei (3 Tags)' should' Anweisungen, die die Punkte vergeben, wenn ein Tag "matches" erhöht (was auch immer das in deinem Anwendungsfall bedeutet). Die Idee ist, dass wenn ein Tag übereinstimmt, es die Punktzahl erhöht. –

Antwort

0

Sie können es mit 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

Ich habe vergessen zu erwähnen, dass ich auf Elastic 1.7.5 bin. Ist diese Abfrage in Ordnung? – Hpatoio

+0

Es sollte mit 1.7 funktionieren. Die Idee ist, dass, wenn ein Dokument mit einem der Tags übereinstimmt, der Punktestand +1 erhält. Wenn es zu einem anderen Tag passt, dann ein weiteres +1 und so weiter. Im Grunde wird das Endergebnis die Anzahl der übereinstimmenden Tags +1 (von der standardmäßigen Standardabfrage "match_all") sein. –

+0

Ich musste "Gewicht: 1" zu "Gewicht: 2" ändern, sonst bekam ich seltsame/falsche Ergebnisse, wenn nur mit einem Tag gefiltert wurde. – Hpatoio

Verwandte Themen