2016-08-03 18 views
2

Ich habe zwei Abfragen in ES. Beide haben unterschiedliche Bearbeitungszeiten für denselben Satz von Dokumenten. Beide machen konzeptionell dasselbe. Ich habe wenige ZweifelGefilterte Bool gegen Bool Abfrage: Elasticsearch

1- Was ist der Unterschied zwischen diesen beiden? 2- Welches ist besser zu verwenden? 3- Wenn beide gleich sind, warum funktionieren sie anders?

1. Filtered bool 
    { 
     "from": 0, 
     "size": 5, 
     "query": { 
     "filtered": { 
      "filter": { 
      "bool": { 
       "must": [ 
       { 
        "term": { 
        "called_party_address_number": "1987112602" 
        } 
       }, 
       { 
        "term": { 
        "original_sender_address_number": "6870340319" 
        } 
       }, 
       { 
        "range": { 
        "x_event_timestamp": { 
         "gte": "2016-07-01T00:00:00.000Z", 
         "lte": "2016-07-30T00:00:00.000Z" 
        } 
        } 
       } 
       ] 
      } 
      } 
     } 
     }, 
     "sort": [ 
     { 
      "x_event_timestamp": { 
      "order": "desc", 
      "ignore_unmapped": true 
      } 
     } 
     ] 
    } 

    2. Simple Bool 

    { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "called_party_address_number": "1277478699" 
       } 
      }, 
      { 
       "term": { 
       "original_sender_address_number": "8020564722" 
       } 
      }, 
      { 
       "term": { 
       "cause_code": "573" 
       } 
      }, 
      { 
       "range": { 
       "x_event_timestamp": { 
        "gt": "2016-07-13T13:51:03.749Z", 
        "lt": "2016-07-16T13:51:03.749Z" 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "from": 0, 
     "size": 10, 
     "sort": [ 
     { 
      "x_event_timestamp": { 
      "order": "desc", 
      "ignore_unmapped": true 
      } 
     } 
     ] 
    } 

Mapping:

{ 
    "ccp": { 
     "mappings": { 
     "type1": { 
      "properties": { 
       "original_sender_address_number": { 
        "type": "string" 
       }, 
       "called_party_address_number": { 
        "type": "string" 
       }, 
       "cause_code": { 
        "type": "string" 
       },    
       "x_event_timestamp": { 
        "type": "date", 
        "format": "strict_date_optional_time||epoch_millis" 
       }, 
       . 
       . 
       .    
      } 
     } 
     } 
    } 
} 

Update 1:

Ich versuchte Bool/muss abfragen und Bool/Filter-Abfrage auf denselben Datensatz, aber ich fand das seltsame Verhalten

1- bool/muss Abfrage ist in der Lage, die gewünschten zu suchen dokumentieren

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "called_party_address_number": "8701662243" 
      } 
     }, 
     { 
      "term": { 
      "cause_code": "401" 
      } 
     } 
     ] 
    } 
    } 
} 

2- Während Bool/Filter nicht in der Lage ist, das Dokument zu suchen. Wenn ich die zweite Feldbedingung entfernen sucht er denselben Datensatz mit field2 Wert als 401.

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "term": { 
      "called_party_address_number": "8701662243" 
      } 
     }, 
     { 
      "term": { 
      "cause_code": "401" 
      } 
     } 
     ] 
    } 
    } 
} 

Update2:

Gefunden wird eine Lösung von Scoring-Phase mit Bool unterdrücken/Abfrage muss es innerhalb Einwickeln "Konstante_Score".

{ 
    "query": { 
    "constant_score": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "called_party_address_number": "1235235757" 
       } 
      }, 
      { 
       "term": { 
       "cause_code": "304" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

Nehmen wir versuchen, haben "called_party_address_number" zu entsprechen: "1235235757" und "cause_code": "304".

Antwort

3

Der erste verwendet die alte 1.x Abfrage/Filter-Syntax (d. H. filtered Abfragen wurden zugunsten bool/filter veraltet).

Der zweite verwendet die neue 2.x-Syntax, aber nicht in einem Filterkontext (d. H., Sie verwenden bool/must anstelle von bool/filter). Die Abfrage mit 2.x-Syntax, die auf Ihre erste Abfrage entsprechen (dh, die ohne Score-Berechnung in einem Filterkontext ausgeführt = schneller) wäre dies ein:

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "term": { 
      "called_party_address_number": "1277478699" 
      } 
     }, 
     { 
      "term": { 
      "original_sender_address_number": "8020564722" 
      } 
     }, 
     { 
      "term": { 
      "cause_code": "573" 
      } 
     }, 
     { 
      "range": { 
      "x_event_timestamp": { 
       "gt": "2016-07-13T13:51:03.749Z", 
       "lt": "2016-07-16T13:51:03.749Z" 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "from": 0, 
    "size": 10, 
    "sort": [ 
    { 
     "x_event_timestamp": { 
     "order": "desc", 
     "ignore_unmapped": true 
     } 
    } 
    ] 
} 
+0

Interessanterweise ist die zweite von Kopf plugin.Thanks erzeugt wird . – Mudit

+0

Beide sind gültig, aber die erste mit 'must' wird im Abfragekontext ausgeführt (mit Score-Berechnung, daher langsamer), während die zweite mit' filter' eine Art Optimierung ist, wenn Sie kein Scoring benötigen. – Val

+0

Ich brauche dafür keine Punkte. Gehen Sie für einen von Ihnen vorgeschlagenen. Vielen Dank für schnelle Hilfe. – Mudit