2014-07-08 9 views
24

Nell'implementazione elasticsearch, ho pochi semplici aggregazioni sulla base di alcuni campi, come mostrato qui sotto -elasticsearch - L'aggregazione restituisce i termini in chiave, ma non il campo completo, come posso ottenere il campo completo restituito?

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

Le aggregazioni funzionano bene e ottengo i risultati di conseguenza. ma il campo chiave del titolo restituito (o qualsiasi altro campo - multi parola), ha una sola parola aggregazione e risultati. Ho bisogno del titolo completo nel risultato restituito, piuttosto solo di una parola, il che non ha molto senso. come posso averlo.

risultati attuali (solo un frammento) -

"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 
     } ] } 

risultati attesi -

"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 
      } } 

sono andato attraverso un sacco di documentazione, spiega diversi modi di aggregare i risultati, ma non ho potuto trovare come ottenere il testo completo se un campo in chiave in risultato, si prega di avvisare come posso ottenere questo?

risposta

28

È necessario disporre di copie untokenized dei termini dell'indice, nel vostro uso mappatura 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" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Nel vostro riferimento di query di aggregazione i campi untokenized:

"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

grazie mille Dan !! Ho intenzione di provare questo, sembra molto promettente! – dev123

+0

che ne dici di un campo, che ho bisogno di avere tokenizzato per la query di ricerca, ma allo stesso tempo reso nulla per le aggregazioni? – ulkas

+1

Il mapping sopra lo fa, indicizza il campo usando l'analizzatore predefinito (analizzatore standard) e indicizza una versione del campo non modificata. Ad esempio, per la ricerca utilizzare il nome del campo 'title' (tokenized), per le aggregazioni utilizzare il nome del campo' title.untouched' (askenizzato). –

0

Mi sono imbattuto in un problema simile. Quando ho eseguito il comando:

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

risposta era seguente nella quale è stato utile:

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

mi sono reso conto di che l'aggiunta di .raw dovrebbe cambiare l'output e otterrà l'output desiderato.

così qualcosa di simile:

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

ha fatto il trucco per me.

Newbie al elasticsearch ma sto vedendo molti campo di tipo stringa ha un campo "grezzo" che può essere utilizzato all'interno di query.

Sarebbe bello se alcuni esperti potessero far luce sulle mie scoperte. Corretto/Parzialmente corretto/sbagliato?!

+0

Il plug-in di output logstash crea un modello di indice predefinito in Elasticsearch che viene applicato a qualsiasi indice che ha un nome che inizia con 'logstash-'. Quando viene utilizzato questo modello, viene creato un campo 'raw' per impostazione predefinita per ogni proprietà che è di tipo' stringa'. Questo è il modello: https://github.com/logstash-plugins/logstash-output-elasticsearch/blob/v0.2.4/lib/logstash/outputs/elasticsearch/elasticsearch-template.json#L18-L27 –

Problemi correlati