2016-08-11 4 views
0

Mein Zweck ist es, 2 Multi-Match-Abfragen wie folgt zu kombinieren. Ich möchte, dass MPN- oder SKU-Felder für jedes Keyword übereinstimmen müssen. Die Schlüsselwörter "hp" und "301" müssen also entweder in MPN oder in SKU vorhanden sein. oder entweder Name oder Name.raw sollte eines der Schlüsselwörter "hp" oder "301" haben. genaue Übereinstimmung, die MPN/SKU sollte höhere Punktzahl haben. Ich schrieb Abfrage wie folgt, aber es gibt keine Ergebnisse zurück, obwohl es Dokumente gibt, die diese Bedingungen haben. meine Fragen sind,Wie kombiniere ich Multi-Match-Abfragen?

1) Does must query require keyword to be found in both SKU and MPN 
for the multi_match query? 

2) Combination of must and should is AND or OR? it looks like AND 
for me as it doesn't return any result. if it is AND, how to make it 
as OR? I cant find any operator on bool. I tried to wrap in another 
should query but it didnt help. 

Ich schätze auch jede Abfrage Vorschlag für meine Zwecke.

"from": 0, 
     "size": 10, 
     "explain": true, 
     "query": { 
      "bool": { 
      "must": [ 
       { 
        "multi_match": { 
         "type": "best_fields", 
         "query": "hp 301", 
         "fields": [      
         "MPN^9", 
         "SKU^8"    
         ], 
       "operator": "and" 
        } 
       } 
      ], 
      "should": [ 
       {"multi_match": { 
         "type": "best_fields", 
        "query": "hp 301", 
        "fields": [ 
         "Name.raw2^7.5", 
         "Name^7" 
         ] 
       }} 
      ] 
      } 
     } 

Antwort

0

Ich gehe davon aus, dass das Problem etwas mit dieser Frage hier zu tun hat. How do && and || work constructing queries in NEST?

Wenn ich richtig verstehe, eine Kombination von Most und sollte so muss handeln mit als Booster sollte, wie er sagt, unter

bool 
>  must 
>   term1 
>  should 
>   term2 
>   term3 
>   term4 

Dies liegt daran, sobald Eine boolesche Abfrage hat eine Muss-Klausel, die als Boostfaktor zu wirken beginnt. So in dem

vorherigen könnten Sie zurück Ergebnisse erhalten, die nur enthalten term1 diese ist eindeutig nicht das, was man im strengen boolean Sinne des Eingangs will.

Daher änderte ich meine Abfrage in 2 sollte Abfragen mit einem von ihnen mit "UND" -Operator. Also wird sich dieses wie MUST verhalten, da es alle Suchschlüsselwörter zwingen wird, die in Feldern gefunden werden sollten.

"from": 0, 
     "size": 10, 
     "explain": true, 
     "query": { 
      "bool": { 
      "should": [ 
       { 
        "multi_match": { 
         "type": "best_fields", 
         "query": "hp 301", 
         "fields": [      
         "MPN^9", 
         "SKU^8"    
         ], 
       "operator": "and" 
        } 
       }    , 
       { 
       "multi_match": { 
         "type": "best_fields", 
        "query": "hp 301", 
        "fields": [ 
         "Name.raw2^7.5", 
         "Name^7" 
         ] 
       } 
       } 
      ] 

      } 
     }