2016-06-09 6 views
0

Ich bin sehr neu in ElasticSearch (Version 2.3.3) und das ist mein folgendes Format für die Daten.ElasticSearch insgesamt unterschiedliche Vorkommen über die gesamten Daten

{ 
    "title": "Doc 1 title", 
    "year": "14", 
    "month": "06", 
    "sentences": [ 
     { 
      "id": 1, 
      "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit", 
      "class": "Introduction", 
      "synth": "intr" 
     }, 
     { 
      "id": 2, 
      "text": "Donec molestie pulvinar odio, ultricies dictum mi porttitor sit amet.", 
      "class": "Introduction", 
      "synth": "abstr" 
     }, 
     { 
      "id": 3, 
      "text": "Aliquam id tristique diam. Suspendisse convallis convallis est ut condimentum.", 
      "class": "Main_Content", 
      "synth": "body" 
     }, 
     { 
      "id": 4, 
      "text": "Nunc ornare eros at pretium faucibus. Praesent congue cursus aliquet.", 
      "class": "Main_Content", 
      "synth": "body" 
     }, 
     { 
      "id": 5, 
      "text": "Integer pellentesque quam ut nulla dignissim hendrerit.", 
      "class": "Future_Work", 
      "synth": "ftr" 
     }, 
     { 
      "id": 6, 
      "text": "Pellentesque faucibus vehicula diam.", 
      "class": "Bibliography", 
      "synth": "bio" 
     } 
    ] 
} 

Und mehrere Dokumente wie doc1, doc2, ..., doc700.

Ich versuche, eine solche Abfrage zu generieren, dass ich die Gesamtzahl der Vorkommen von jeder anderen "Klasse" über meine gesamte Dokumentenmenge sortiert nach Jahr erhalten.

Also wäre das Ergebnis etwas ähnlich dem Folgenden.

{ 
    "year" : "14", 
    "count" : [ 
     { "Introduction" : 1357 }, 
     { "Main_Content" : 1021 }, 
     { "Future_Work" : 490 }, 
     { "Bibliography" : 241 } 
    ], 
    "year" : "15", 
    "count" : [ 
     { "Introduction" : 972 } , 
     { "Main_Content" : 712 }, 
     { "Future_Work" : 335 }, 
     { "Bibliography" : 81 } 
    ] 
} 

Ist es möglich zu erreichen, was ich poste? Oder wäre es einfacher für jede "Klasse" zu machen?

Vielen Dank.

Antwort

1

Dies könnte die Nested Aggregation getan werden. Wenn Ihre vorhandene Mapping-Mapping dann nicht verschachtelt sind, können Sie vielleicht die folgende verwenden:

{ 
    "mappings": { 
     "book": { 
      "properties": { 
      "title": { 
       "type": "string" 
      }, 
      "month": { 
       "type": "string" 
      }, 
      "year": { 
       "type": "string" 
      }, 
      "sentences": { 
       "type": "nested", 
        "properties": { 
         "synth": { 
          "type": "string" 
         }, 
         "id": { 
          "type": "long" 
         }, 
         "text": { 
          "type": "string" 
         }, 
         "class": { 
          "type": "string" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Dann führen Sie die folgende Abfrage:

{ 
    "size": 0, 
    "aggs": { 
     "years": { 
      "terms": { 
       "field": "year" 
      }, 
      "aggs" : { 
       "sentences" : { 
        "nested" : { 
         "path" : "sentences" 
        }, 
        "aggs" : { 
         "classes" : { "terms" : { "field" : "sentences.class" } } 
        } 
       } 
      } 
     } 
    } 
} 

Und hier ist die Beispieldaten:

"aggregations": { 
    "years": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "14", 
      "doc_count": 2, 
      "sentences": { 
       "doc_count": 12, 
       "classes": { 
        "doc_count_error_upper_bound": 0, 
        "sum_other_doc_count": 0, 
        "buckets": [ 
        { 
         "key": "introduction", 
         "doc_count": 4 
        }, 
        { 
         "key": "main_content", 
         "doc_count": 4 
        }, 
        { 
         "key": "bibliography", 
         "doc_count": 2 
        }, 
        { 
         "key": "future_work", 
         "doc_count": 2 
        } 
        ] 
       } 
      } 
     }, 
     { 
      "key": "15", 
      "doc_count": 1, 
      "sentences": { 
       "doc_count": 5, 
       "classes": { 
        "doc_count_error_upper_bound": 0, 
        "sum_other_doc_count": 0, 
        "buckets": [ 
        { 
         "key": "main_content", 
         "doc_count": 2 
        }, 
        { 
         "key": "bibliography", 
         "doc_count": 1 
        }, 
        { 
         "key": "future_work", 
         "doc_count": 1 
        }, 
        { 
         "key": "introduction", 
         "doc_count": 1 
        } 
        ] 
       } 
      } 
     } 
     ] 
    } 
} 

Verwechseln Sie nicht den doc_count hier, sie sind das wahre Vorkommen Ihrer "Klasse" im Hauptdokument. Sie werden tatsächlich als verschachtelte Dokumente gespeichert, die an das Hauptdokument gebunden sind.

Ich hoffe, es hilft.

+0

Ich habe wie Sie versucht Mapping haben vorgeschlagen, aber wenn die Abfrage ausgeführt ich { „type“: „aggregation_execution_exception“, „Grund“: „[verschachtelte] verschachtelt Pfad [Sätze] nicht verschachtelt ist“} – Mayhem

+0

Könnten Sie Überprüfen Sie, ob das Mapping für den Index korrekt erstellt wurde. –

+0

Ja, wenn ich -XGET/index/_mapping/type ausführe, erhält es das Mapping, obwohl ich sagen muss, dass die Daten, die ich in der Frage präsentierte, nicht die ganzen Daten sind. Ich versuche, den spezifischen Teil, der für die Abfrage wichtig ist, zuzuordnen, der Rest (den ich weggelassen habe) ist für die Abfrage nicht relevant und enthält keines der Felder, die ich suchen und zählen möchte. – Mayhem

0

Sie können Aggs ineinander verschachteln, und mit den Begriffen Aggregation werden die Ergebnisse in Buckets aufgeteilt und gezählt, wie Sie es sich wünschen. Ein Beispiel wäre

POST index/type/_search 
{ 
    "size": 0, 
    "aggs": { 
    "agg1": { 
     "terms": { 
     "field": "year" 
     }, 
     "aggs": { 
     "agg2": { 
      "terms": { 
      "field": "sentences.class" 
      }   
     } 
     } 
    } 
    } 
} 

Ich habe dies nicht mit einem verschachtelten Array von Objekten vor, aber es sollte noch funktionieren. Einige weitere hilfreiche Informationen finden Sie hier

https://www.elastic.co/guide/en/elasticsearch/guide/current/aggregations-and-analysis.html

+0

Vielen Dank für die sehr schnelle Reaktion. Ja, diese Abfrage funktioniert so, wie ich es wünsche, aber die Rückgabe der zweiten Aggregation gibt nur die Zahl doc_count zurück, und nicht die Häufigkeit des Auftretens. Es ist die wahre Frage, die Anzahl der Vorkommen einer bestimmten Klasse in jedem Dokument, das zu einem bestimmten Jahr gehört, zu zählen. – Mayhem

Verwandte Themen