2015-08-29 7 views
5

Ich habe schon seit einiger Zeit mit elasticsearch Query und Filter experimentiert aber nie mit Aggregationen gearbeitet. Die Idee, dass wir die Aggregationen mit unserer Anfrage zusammenfassen können, erscheint mir ziemlich erstaunlich, aber ich möchte verstehen, wie man es richtig macht, damit ich keine Fehler mache. Derzeit sind alle meine Suchanfragen auf diese Weise gestaltet:Elasticsearch: Wie skaliert man Aggregationen auf Ihre Anfrage und Filter?

{ 
    "query": { 

    }, 
    "filter": { 

    }, 
    "from": 0, 
    "size": 60 
} 

Nun, wenn ich einige Aggregations Eimer hinzugefügt, wurde die Struktur dieser:

{ 
    "aggs": { 
     "all_colors": { 
     "terms": { 
      "field": "color.name" 
     } 
     }, 
     "all_brands": { 
     "terms": { 
      "field": "brand_slug" 
     } 
     }, 
     "all_sizes": { 
     "terms": { 
      "field": "sizes" 
     } 
     } 
    }, 
    "query": { 

    }, 
    "filter": { 

    }, 
    "from": 0, 
    "size": 60 
} 

jedoch die Ergebnisse der Aggregation sind immer gleich, unabhängig von welchen Informationen ich im Filter zur Verfügung stelle.

Nun, wenn ich die Abfrage-Struktur in etwa so verändert, begann es unterschiedliche Ergebnisse zeigen:

{ 
    "aggs": { 
     "all_colors": { 
     "terms": { 
      "field": "color.name" 
     } 
     }, 
     "all_brands": { 
     "terms": { 
      "field": "brand_slug" 
     } 
     }, 
     "all_sizes": { 
     "terms": { 
      "field": "sizes" 
     } 
     } 
    }, 
    "query": { 
     "filtered": { 
      "query": { 

      }, 
      "filter": { 

      }   
     } 
    }, 
    "from": 0, 
    "size": 60 
} 

Bedeutet es, ich werde die Struktur meiner Suchanfrage überall auf diesen neuen gefilterten Typen verändern muß der Struktur? Gibt es eine andere Problemumgehung, die es mir ermöglicht, die gewünschten Ergebnisse zu erzielen, ohne so viel Code ändern zu müssen?

Auch ich eine andere Sache beobachtet, dass, wenn mein brand_slug Feld mehrere Keywords wie „Peter england“ enthält, dann diese beiden in separaten Eimer wie diese zurückgegeben werden:

{ 
    "buckets": [ 
     { 
      "key": "england", 
      "doc_count": 368 
     }, 
     { 
      "key": "peter", 
      "doc_count": 368 
     } 
    ] 
} 

Wie kann ich, dass beide gewährleisten diese enden in einem gleichen Eimer wie folgt auf:

{ 
    "buckets": [ 
     { 
      "key": "peter england", 
      "doc_count": 368 
     } 
    ] 
} 

UPDATE: Dieser zweite Teil ich in der Lage gewesen, durch Indizierung Marke, Farbe und Größen unterschiedlich wie folgt zu erreichen:

"sizes": { 
    "type": "string", 
    "fields": { 
     "raw": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
    } 
} 

Antwort

4

Was Sie bemerkt haben, ist von Entwurf. Werfen Sie einen Blick auf my answer zu einer ähnlichen Frage zu SO. Im Wesentlichen ist die Eingabe in den Aggregations- und Filterabschnitten die Ausgabe des Abfrageabschnitts. Filtered Query wie Sie vorgeschlagen haben, wäre der beste Weg, um die gewünschten Ergebnisse zu erreichen. Es gibt auch einen anderen Weg. Sie können Filter Aggregation verwenden. Dann müssten Sie Ihre Abfrage- und Filterbereiche nicht ändern, sondern einfach den Filterbereich innerhalb der Aggregationsbereiche kopieren, aber das wäre meiner Meinung nach ein Overkill und eine Verletzung der DRY principle im Allgemeinen.

+0

danke für die Antwort. Eine Sache, die mich wundern lässt, ist, dass Sie sagen, dass die Abfrage zuerst angewendet wird und dann filtern? Nur neugierig, warum es nicht umgekehrt ist, da Filter sind relativ schneller und sie können erheblich reduzieren die Anzahl der Ergebnisse, um die Abfrage Übereinstimmungen danach –

+0

Filter werden vor der Abfrage nur angewendet, wenn sie Teil einer gefilterten Abfrage sind. Weitere Informationen finden Sie unter https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html#_filter_strategy. Der Filter, über den wir hier sprechen, ist eigentlich ein 'post_filter', der, wie der Name schon sagt, nach der Ausführung der Abfrage angewendet wird. Lesen Sie https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html für weitere Details. – bittusarkar

+0

ok. Sie meinen also, wenn ich meine Abfragestruktur in gefilterte Abfrage ändere, könnte ich auch Leistungsverbesserungen bekommen? –

Verwandte Themen