2016-05-18 14 views
0

Ich versuche, eine Abfrage für elasticsearch zu erstellen. Die Bedingungen: Es gibt immer einen Kundenfilter. Es gibt ein Feld "name", das bei Übereinstimmung die höchste Punktzahl erzeugen sollte, das nächstbeste Feld sollte "category" und dann "description" sein. Aber ein Ergebnis sollte zurückgegeben werden, auch wenn die Suche nichts in "Name" oder "Kategorie" findet, sondern nur in "Beschreibung".elasticsearch: mehrere Felder mit Boosts

Was ich versuche:

 $query = [ 
     'filtered' => [ 
      'filter' => [ 
       'term' => [ 'customer' => $selectedCustomer ] 
      ], 
      'query' => [ 
       'bool' => [ 
        'should' => [ 
         'match' => [ 
          'name' => [ 
           'query' => $val, 
           'boost' => 7 
          ] 
         ] 
        ], 
        'should' => [ 
         'match' => [ 
          'category' => [ 
           'query' => $val, 
           'boost' => 3 
          ] 
         ], 
        ], 
        'should' => [ 
         'match' => [ 
          'description' => [ 
           'query' => $val, 
           'boost' => 1 
          ] 
         ], 
        ], 
       ] 
      ] 
     ] 
    ]; 

aber dies scheint nur die Ergebnisse mit einem Spiel in „Beschreibung“ zurückzukehren. Was mache ich falsch? Irgendwelche Hinweise?

+0

Diese Serie von drei 'sollte' ein einzelnes Array erstellen, das die drei 'match's enthält? (Wie ' "Bool": { "sollte": [ { "match": { "FIELD": "TEXT" } }, { "match": { "FIELD":„TEXT " } }, {} ... ] }') –

+0

.... ja, jetzt, wo ich es sehe, natürlich, die Sinn macht. Aber wie würde ich es richtig machen? – Chi

+0

Ich weiß nicht, PHP, aber ich bin sicher, dass so die Abfrage aussehen sollte. –

Antwort

0

scheint, wie ich eine Lösung für das erste Problem, indem Sie es wie folgt gefunden:

 $query = [ 
     'filtered' => [ 
      'filter' => [ 
       'term' => [ 'customer' => $selectedCustomer ] 
      ], 
      'query' => [ 
       'bool' => [ 
        'should' => [ 
         ['match' => [ 
          'name' => [ 
           'query' => $val, 
           'boost' => 7 
          ] 
         ]], 
         ['match' => [ 
          'category' => [ 
           'query' => $val, 
           'boost' => 5 
          ] 
         ]], 
         ['match' => [ 
          'description' => [ 
           'query' => $val, 
           'boost' => 1 
          ] 
         ]], 

        ], 
       ] 
      ] 
     ] 
    ]; 

Das obwohl nächste Problem ist, dass dies findet passt nur für ganze Wörter. Zum Beispiel, wenn $ val = 'Brot', bekomme ich alle Treffer, die das Wort "Brot" enthalten, aber ich bekomme keine Sachen wie "Lebkuchen". Wer kennt dafür irgendwelche Lösungen?

Verwandte Themen