0

Ich habe eine Hauptabfrage und ich brauche die Anzahl der Übereinstimmungen für ein paar Unterabfragen. In solr Worten brauche ich eine facet.query. Was mir fehlt ist eine einfache doc_count Aggregation wie die value_count aggregation.Belegzählung Aggregation über Abfrage in Elasticsearch (wie facet.query in solr)

Irgendwelche Vorschläge?

fand ich zwei mögliche Lösungen, die Ich mag nicht:

  1. Verwenden filter aggregation mit value_count Metrik auf _id:

Beispiel:

GET _search 
{ 
    "query": { 
     "match_main": {} 
    }, 
    "aggs": { 
      "facetvalue1": { 
       "filter": { 
        "bool": { 
        "should": [ 
         {"match": { "name": "fred" }}, 
         {"term": { "lastname": "krueger" }} 
        ] 
        } 
       }, 
       "aggs": { 
        "count": { 
         "value_count": { 
          "field": "_id" 
         } 
        } 
       } 
      }, 
      "facetvalue2": { 
       "filter": { 
         "term": { "name": "freddy" } 
       }, 
       "aggs": { 
        "count": { 
         "value_count": { 
          "field": "_id" 
         } 
        } 
       } 
      } 
    } 
} 
  1. Verwenden Sie Multi Search API

Beispiel:

GET _msearch 
{"index":"myindex"} 
{"query":{"match_main": {}}} 
{"index":"myindex"} 
{"size": 0, "query":{"match_main": {}}, "filter": {"bool": {"should":[{"match": { "name": "fred" }},{"term": { "lastname": "krueger" }}]}}} 
{"index":"myindex"} 
{"size": 0, "query":{"match_main": {}},"filter": {"term": { "name": "freddy" }}} 

Ich sehe, dass die Lösung 2 schneller ist, aber match_main als komplexe Abfrage vorstellen! Also würde ich Lösung 1 bevorzugen, wenn es eine doc_count:{} anstelle von value_count:{"field":"_id"} geben würde.

Aber zurück zu meiner Grundfrage: Was ist das Gegenstück zum Solr facet.query in elasticsearch?

Antwort

1

Sie können dafür einen filters aggregation verwenden. Beachten Sie die zusätzliche s, die sich von der bereits erwähnten filter Aggregation unterscheidet.

{ 
    "query": { 
    "match_all": {} 
    }, 
    "size": 0, 
    "aggs": { 
    "values": { 
     "filters": { 
     "filters": { 
      "value1": { 
      "bool": { 
       "should": [ 
       { 
        "match": { 
        "name": "fred" 
        } 
       }, 
       { 
        "term": { 
        "lastname": "krueger" 
        } 
       } 
       ] 
      } 
      }, 
      "value2": { 
      "term": { 
       "name": "freddy" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

so etwas wie

"aggregations": { 
    "values": { 
    "buckets": { 
     "value1": { 
     "doc_count": 4 
     }, 
     "value2": { 
     "doc_count": 1 
     } 
    } 
    } 
} 

bearbeiten zurückzukehren Dies wird: Als allgemeine Anmerkung, Sie müssen nicht eine Metrik Aggregation auf Ihrem Eimer Aggregationen verwenden. Wenn Sie keine Subaggregationen bereitstellen, erhalten Sie nur die Anzahl der Dokumente. In diesem Fall wird filters die Buckets bereitstellen, aber mehrere filter Aggregationen sollten ebenfalls funktionieren.

Verwandte Themen