2012-11-01 14 views
19

Come posso avere i segni di un campo particolare restituiti nel risultatoelasticsearch - Riportare i gettoni di un campo

Ad esempio, una richiesta GET

curl -XGET 'http://localhost:9200/twitter/tweet/1' 

rendimenti

{ 
    "_index" : "twitter", 
    "_type" : "tweet", 
    "_id" : "1", 
    "_source" : { 
     "user" : "kimchy", 
     "postDate" : "2009-11-15T14:12:12", 
     "message" : "trying out Elastic Search" 
    } 
} 

Mi piacerebbe avere i token del campo "_source.message" inclusi nel risultato

risposta

27

C'è anche un altro modo per farlo utilizzando il seguente script_fields script:

curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{ 
    "query" : { 
     "match_all" : { } 
    }, 
    "script_fields": { 
     "terms" : { 
      "script": "doc[field].values", 
      "params": { 
       "field": "message" 
      } 
     } 

    } 
}' 

E 'importante notare che, mentre questo script restituisce i termini effettivi che sono stati indicizzati, memorizza nella cache tutti i valori di campo e di grandi dimensioni gli indici possono usare molta memoria. Così, su grandi indici, potrebbe essere più utile per recuperare i valori di campo da campi o fonte memorizzati e rianalizzare nuovamente al volo utilizzando il seguente MVEL script:

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; 
import java.io.StringReader; 

// Cache analyzer for further use 
cachedAnalyzer=(isdef cachedAnalyzer)?cachedAnalyzer:doc.mapperService().documentMapper(doc._type.value).mappers().indexAnalyzer(); 

terms=[]; 
// Get value from Fields Lookup 
//val=_fields[field].values; 

// Get value from Source Lookup 
val=_source[field]; 

if(val != null) { 
    tokenStream=cachedAnalyzer.tokenStream(field, new StringReader(val)); 
    CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute); 
    while(tokenStream.incrementToken()) { 
    terms.add(termAttribute.toString()) 
    }; 
    tokenStream.close(); 
} 
terms 

Questo script MVEL può essere memorizzato come config/scripts/analyze.mvel e usato con la seguente domanda:

curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{ 
    "query" : { 
     "match_all" : { } 
    }, 
    "script_fields": { 
     "terms" : { 
      "script": "analyze", 
      "params": { 
       "field": "message" 
      } 
     } 

    } 
}' 
+3

Questo è spaventoso !!! Bella risposta! – javanna

+0

È spaventoso, ma divertente. :) Vorrei poter accedere a IndexReader in DocLookup (è lì, ma al momento è privato). Quindi sarebbe stato possibile utilizzare i vettori di termini invece di analizzare nuovamente il testo la seconda volta. – imotov

+0

Sì, certo. Non sarebbe bello anche leggere il termine vettori senza script, magari attraverso un plugin? – javanna

6

Se intendi il tok ens che è stato indicizzato puoi creare un terms facet nel campo del messaggio. Aumentare il valore size per ottenere più voci indietro o impostare su 0 per ottenere tutti i termini.

Lucene fornisce la possibilità di memorizzare i vettori di termini, ma non c'è modo di avere accesso ad esso con elasticsearch ormai (per quanto ne so).

Perché ne hai bisogno? Se vuoi solo controllare cosa stai indicizzando puoi dare un'occhiata allo analyze api.

+0

Bello, questo è quello che sto cercando. Grazie – Kennedy

Problemi correlati