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"
}
}
}
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 –
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
ok. Sie meinen also, wenn ich meine Abfragestruktur in gefilterte Abfrage ändere, könnte ich auch Leistungsverbesserungen bekommen? –