2014-07-08 7 views
24

In der Elasticsearch Implementierung, ich habe einige einfache Aggregationen auf der Basis von wenigen Felder, wie unten gezeigt -elasticsearch - Aggregation gibt Terme im Schlüssel zurück, aber nicht das komplette Feld, wie kann ich das volle Feld zurückgeben?

"aggs" : { 
    "author" : { 
     "terms" : { "field" : "author" 
      , "size": 20, 
      "order" : { "_term" : "asc" } 
     } 
    }, 
    "title" : { 
     "terms" : { "field" : "title" 
      , "size": 20 
     } 
    }, 
    "contentType" : { 
     "terms" : { "field" : "docType" 
      , "size": 20 
     } 
    } 
} 

Die Aggregationen funktionieren und ich die Ergebnisse entsprechend zu bekommen. aber das Titelschlüsselfeld, das zurückgegeben wird (oder jedes andere Feld - Mehrfachwort), hat Einzelwortaggregation und Ergebnisse. Ich brauche den vollständigen Titel in dem zurückgegebenen Ergebnis, anstatt nur ein Wort - was nicht viel Sinn macht. Wie kann ich das bekommen?

Aktuelle Ergebnisse (nur ein Ausschnitt) -

"title": { 
    "buckets": [ 
     { 
      "key": "test", 
      "doc_count": 1716 
     }, 
     { 
      "key": "pptx", 
      "doc_count": 1247 
     }, 
     { 
      "key": "and", 
      "doc_count": 661 
     }, 
     { 
      "key": "for", 
      "doc_count": 489 
     }, 
     { 
      "key": "mobile", 
      "doc_count": 487 
     }, 
     { 
      "key": "docx", 
      "doc_count": 486 
     }, 
     { 
      "key": "pdf", 
      "doc_count": 450 
     }, 
     { 
      "key": "2012", 
      "doc_count": 397 
     } ] } 

erwartete Ergebnisse -

"title": { 
     "buckets": [ 
      { 
       "key": "test document for stack overflow ", 
       "doc_count": 1716 
      }, 
      { 
       "key": "this is a pptx", 
       "doc_count": 1247 
      }, 
      { 
       "key": "its another document and so on", 
       "doc_count": 661 
      }, 
      { 
       "key": "for", 
       "doc_count": 489 
      }, 
      { 
       "key": "mobile", 
       "doc_count": 487 
      }, 
      { 
       "key": "docx", 
       "doc_count": 486 
      }, 
      { 
       "key": "pdf", 
       "doc_count": 450 
      }, 
      { 
       "key": "2012", 
       "doc_count": 397 
      } } 

ich durch eine Menge Dokumentation ging, erklärt es verschiedene Möglichkeiten, um aggregierte Ergebnisse, aber ich konnte nicht Finden Sie, wie Sie den vollständigen Text erhalten, wenn ein Feld im Schlüssel im Ergebnis ist, bitte beraten Sie, wie ich das erreichen kann?

Antwort

28

brauchen Sie nicht geteilte Kopien der Begriffe im Index haben, in Ihrer Mapping Verwendung multi-fields:

{ 
    "test": { 
     "mappings": { 
      "book": { 
       "properties": {     
        "author": { 
         "type": "string", 
         "fields": { 
          "untouched": { 
           "type": "string", 
           "index": "not_analyzed" 
          } 
         } 
        }, 
        "title": { 
         "type": "string", 
         "fields": { 
          "untouched": { 
           "type": "string", 
           "index": "not_analyzed" 
          } 
         } 
        }, 
        "docType": { 
         "type": "string", 
         "fields": { 
          "untouched": { 
           "type": "string", 
           "index": "not_analyzed" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

In Ihrer Aggregationsanfrag Referenz der nicht geteilte Felder:

"aggs" : { 
    "author" : { 
     "terms" : { 
      "field" : "author.untouched", 
      "size": 20, 
      "order" : { "_term" : "asc" } 
     } 
    }, 
    "title" : { 
     "terms" : { 
      "field" : "title.untouched", 
      "size": 20 
     } 
    }, 
    "contentType" : { 
     "terms" : { 
      "field" : "docType.untouched", 
      "size": 20 
     } 
    } 
} 
+1

vielen Dank Dan! Ich werde es versuchen, sieht sehr vielversprechend aus! – dev123

+0

Wie wäre es mit einem Feld, das ich für die Suche in Token haben muss, aber gleichzeitig nicht für Aggregationen? – ulkas

+1

Das obige Mapping macht das, es indiziert das Feld unter Verwendung des Standardanalysators (Standardanalysator) und indiziert eine nicht-aktinierte Version des Feldes. Verwenden Sie beispielsweise für die Suche den Feldnamen 'title' (mit Token versehen), für Aggregationen den Feldnamen' title.unouched' (nicht-akzentuiert). –

0

Ich stieß auf ein ähnliches Problem. Wenn ich den Befehl lautete:

curl -XGET "localhost:9200/logstash*/_mapping?pretty" 

Antwort darin folgende hatte, die nützlich war:

"host" : { 
    "type" : "string", 
     "norms" : { 
     "enabled" : false 
     }, 
     "fields" : { 
     "raw" : { 
      "type" : "string", 
      "index" : "not_analyzed", 
      "ignore_above" : 256 
     } 
     } 
    },... 

ich als realisiert Hinzufügen .RAW die Ausgabe ändern sollte und die gewünschte Ausgabe erhalten.

so etwas wie:

 "aggs": { 
     "computes": { 
      "terms": { 
      "field": "host.raw", 
      "size": 0 
      } 
     }   
     } 

hat den Trick für mich.

Neu bei der Elasticsearch, aber ich sehe viele Felder des Typs Zeichenfolge hat ein "rohes" Feld, das innerhalb der Abfrage verwendet werden kann.

Es wäre gut, wenn einige Experten meine Erkenntnisse beleuchten könnten. Richtig/teilweise richtig/falsch?!

+0

Das Logstash-Ausgabe-Plugin erstellt eine Standard-Indexvorlage in Elasticsearch, die auf jeden Index angewendet wird, der einen Namen hat, der mit 'logstash-' beginnt. Wenn diese Vorlage verwendet wird, wird standardmäßig ein 'rohes' Feld für jede Eigenschaft vom Typ 'string' erzeugt. Dies ist die Vorlage: https://github.com/logstash-plugins/logstash-output-elasticsearch/blob/v0.2.4/lib/logstash/outputs/elasticsearch/elasticsearch-template.json#L18-L27 –