3

Ich benutze den AWS ElasticSearch Service (1.5.2) und empfängt mehr als 100 Anfragen/Sek. Ohne Probleme.Filter auf booleschem Feld erhöht Latenz und CPU

Fast jede Abfrage hat Geo-Filter, Volltext-Filter, Ganzzahl-Filter ... Aber ich habe ein Problem, einen einfachen Filter hinzufügen mehr; ein boolescher Termfilter.

{ 
    "from" : 0, 
    "size" : 10, 
    "query" : { 
    "filtered" : { 
     "query" : { 
     "match_all" : { } 
     }, 
     "filter" : { 
     "and" : { 
      "filters" : [ { 
      "bool" : { 
       "must" : [ { 
       "terms" : { 
        "my_boolean_field" : [ false ] 
       } 
       }, 
       { 
       "range" : { 
        "_timestamp" : { 
        "from" : null, 
        "to" : "2016-05-04T15:12:00Z", 
        "include_lower" : true, 
        "include_upper" : false 
        } 
       } 
       } ] 
      } 
      }, { 
      "geo_distance" : { 
       "rounded_location" : [ -8.42, 42.24 ], 
       "distance" : "300000m", 
       "distance_type" : "plane", 
       "optimize_bbox" : "indexed" 
      } 
      } ] 
     } 
     } 
    } 
    }, 
    "sort" : [ { 
    "_geo_distance" : { 
     "rounded_location" : [ { 
     "lat" : 42.24, 
     "lon" : -8.42 
     } ], 
     "unit" : "m" 
    } 
    }, { 
    "date" : { 
     "order" : "desc" 
    } 
    }, { 
    "price" : { 
     "order" : "asc" 
    } 
    } ] 
} 

Sobald die Boolesche Filter hinzugefügt wird, die CPU in allen Knoten Elasticsearch steigt von 10 bis 30% und während 10-15 Minuten die durchschnittliche Latenzzeit erhöht sich von 20 bis 400 ms nach einer Weile Latenzen gehen zurück auf normale Zahlen aber CPU nicht.

Dieses boolesche Feld ist ordnungsgemäß zugeordnet und kann durchsucht werden ... hat jemand einen Hinweis auf dieses Problem? (Die Abfrage wird aufgrund der offiziellen Java-Bibliothek, die ich verwende, mit "Begriffen" anstelle von "Begriff" gebildet.

+0

können Sie die gleiche Abfrage versuchen, aber Swap-Positionen zwischen den 'terms' boolean Filter und dem' range' einem in der "müssen" -Klausel? –

+0

Danke für die Antwort! Ich habe das versucht, und ich habe auch versucht, den Booleschen Wert aus dem booleschen Abschnitt auf die gleiche Ebene des geo_location-Filters zu setzen ... Und das Ergebnis war mehr oder weniger das gleiche. –

+0

Jeder Speicher (Heap) Druck während dieser hohen Latenzzeiten? Erhöhte Anzahl und/oder Dauer für die alten GCs? –

Antwort

0

Schließlich konnte ich nicht das Problem lösen Durchführung der Abfrage, wie ich hier beschrieben ...

Ich löste dieses Erstellung 2 verschiedene Dokumenttypen nach dem WAHR/FALSCH Wert des verwandten Bereich.

Mit diesem Ansatz keine CPU-Erhöhung, keine Latenzprobleme ... Und da Elasticsearch in mehrere Dokumenttypen zu einem Zeitpunkt suchen können, wurde diese Trennung keine größeren Probleme auf meine Anwendungscode verursachen;)

So jetzt, ich habe die gleiche Abfrage in beiden Fällen aber nur den Dokumenttyp Ziel zu ändern:

POST /my_index/doc_type_with_true_value/_search 
POST /my_index/doc_type_with_false_value/_search 
{ 
    "from" : 0, 
    "size" : 10, 
    "query" : { 
    "filtered" : { 
     "query" : { 
     "match_all" : { } 
     }, 
     "filter" : { 
     "and" : { 
      "filters" : [ { 
      "bool" : { 
       "must" : [ { 
       "range" : { 
        "_timestamp" : { 
        "from" : null, 
        "to" : "2016-05-04T15:12:00Z", 
        "include_lower" : true, 
        "include_upper" : false 
        } 
       } 
       } ] 
      } 
      }, { 
      "geo_distance" : { 
       "rounded_location" : [ -8.42, 42.24 ], 
       "distance" : "300000m", 
       "distance_type" : "plane", 
       "optimize_bbox" : "indexed" 
      } 
      } ] 
     } 
     } 
    } 
    }, 
    "sort" : [ { 
    "_geo_distance" : { 
     "rounded_location" : [ { 
     "lat" : 42.24, 
     "lon" : -8.42 
     } ], 
     "unit" : "m" 
    } 
    }, { 
    "date" : { 
     "order" : "desc" 
    } 
    }, { 
    "price" : { 
     "order" : "asc" 
    } 
    } ] 
}