2017-01-25 2 views
1

Ich verwende die node.js sdk, um eine elasticsearch-Abfrage auszuführen, die alle Felder nach Text durchsucht, dann die Ergebnisse nach einer Teilmenge filtert und dann auf Grundlage eines benutzerdefinierten Index aggregiert .Elastische Suchabfrage mit Filter und Aggregation gibt keine Aggregationen zurück

Ich habe mir die ES-Dokumentation und einige Stack-Überlauffragen angeschaut, die Filter und Aggregationen beinhalten, um sicherzustellen, dass meine Abfragesyntax korrekt ist, und ich sehe keinen Syntaxfehler, wenn die Abfrage ausgeführt wird. Meine Abfrage trifft 2000+ Dokumente in meinem Dataset, aber das Antwortobjekt enthält keine Aggregationen.

var search_text = "Chase Bank"; 
var doctype_selections = ["mortgage"]; 

es.search({ 
    index: index_list, 
    type: 'page', 
    body: { 
     query: { 
      filtered: { 
       query: { 
        match: { 
         _all: { 
          "query": search_text, 
          "operator": "and" 
         } 
        }, 
        filter: { 
         terms: { 
          document_type: doctype_selections 
         } 
        } 
       } 
      } 
     }, 
     aggs: { 
      "top_tag_hits":{ 
       terms: { 
        field: "agg_index", 
        size: agg_size 
       }, 
       aggs: { 
        "hits":{ 
         top_hits: { 
          size: agg_size 
         } 
        } 
       } 
      } 
     }, 
    }, 
    explain: true, 
    size: result_size, 
}).then(function (resp) { 
    var hits = resp.hits.hits; 
    var aggs = resp.aggregations; 
    console.log(resp); 
    response.send(aggs); 
}, function (err) { 
    console.trace(err.message); 
    response.send(err.message); 
}); 

Von dem, was ich die richtige Reihenfolge der Vorgänge in es verstehen würde query->filter query->aggregation on filtered query. Wenn Sie den Filter und die Aggregation entfernen, funktioniert die Abfrage wie vorgesehen. Wenn ich den Filter entferne, aber die Aggregation und die Abfrage behält und Aggregationen zurückgibt. Wenn ich die Aggregation entferne und den Filter behalte, funktioniert es auch wie vorgesehen.

Es scheint, als ob der gesamte Aggregationsabschnitt der Abfrage einfach ignoriert wird. Was ist das Problem?

Antwort

0

Aggregation arbeitet nach Suchergebnissen, die nach Abfrage zurückgegeben werden. Sie können schauen, um post_filter filtern seine mögliche Ergebnisse von Abfrage zu bekommen und dann Aggregationen berechnen und dann

Auch kann jeder Aggregation haben seine own filter

+0

Aber ist es möglich, die Aggregation filtern vor? – GrantD71

+0

Ja, jede Aggregation kann ihren eigenen Filter haben –

0

Hier ist eine Filter-Aggregation verwenden, wie ich war in der Lage zu erreichen, was ich brauchte, ohne Filteraggregationen zu verwenden. I-Struktur die Abfrage als bool Abfrage, und fügen separate must und filter Klauseln:

es.search({ 
    index: index_list, 
    type: 'page', 
    body: { 
     query: { 
      bool: { 
       must: [ 
        {match: { _all: { 
          "query": search_text, 
          "operator": "and" 
          }}}, 
       ], 
       filter: [ 
        {terms: {document_type: doctype_selections}} 
       ] 
      } 
     }, 
     aggs: { 
      "top_tag_hits":{ 
       terms: { 
        field: "agg_index", 
        size: agg_size 
       }, 
       aggs: { 
        "hits":{ 
         top_hits: { 
          size: agg_size 
         } 
        } 
       } 
      } 
     }, 
    }, 
    explain: true, 
    size: result_size, 
}).then(function (resp) { 
    var hits = resp.hits.hits; 
    var aggs = resp.aggregations; 
    console.log(resp); 
    console.log(aggs); 
    response.send(aggs); 
}, function (err) { 
    console.trace(err.message); 
    response.send(err.message); 
}); 
Verwandte Themen