2015-11-07 17 views
6

Ho inviato una query a elasticsearch ottenere i dati dell'indice .. Ho solo bisogno di questi campi dati e quanti documenti hanno trovato informazioni ... ma ci sono "take", "shards" e all'interno di un documento "_id", "_ index", "_ score". questi sono un necessarie per il mio scopo ..restituire solo i dati di origine dalla query di elasticsearch

Qui la mia semplice richiesta:

query='{"query": {"match_all": {}}}'; 
$.ajax({ 
     url: "http://localhost:9200/webproxylog/_search?source=" + query, 
     type:"GET", 
     dataType: "json", 
     data: $.param(params), 
     success: function(data) {... 

ho controllare i dati di risposta nel metodo di successo qui come sembra: enter image description here

voglio solo ottenere successi quali documenti, e nei documenti voglio solo "_source" oggetto che ha dati di campo. "ha preso", "shards", "_ id", "_ index", inutile, come posso disabilitarli

+2

Perché non si utilizza ElasticJs https://www.elastic.co/guide/en/elasticsearch/c lient/javascript-api/current/quick-start.html? – CodeNotFound

+0

perché non sapevo esistesse una tale libreria: D interessante .. quindi vuoi dire che è facile con e.sj ottenere solo contenuto, non voglio analizzare con response.hits.hits (nei documenti che condividi) Voglio solo che elasticsearch ritorni esattamente ciò che di cui ho bisogno. –

+0

Risparmierai un sacco di tempo a fare altre cose piuttosto che analizzare il JSON restituito tu stesso ;-) – CodeNotFound

risposta

2

Non è possibile disattivare i metadati della risposta. È possibile restituire fields anziché _source se si desidera solo campi specifici, ma ciò non diminuisce la complessità. La libreria può sottrarre parte di ciò, ma non trovo estremamente difficile analizzare semplicemente le risposte ES direttamente.

Ovviamente, è necessario scrivere un piccolo JavaScript. Fortunatamente non è troppo difficile. Qualcosa di simile a questo di solito funziona bene per me:

var results = es_response_data['hits']['hits'].map(function(i){ 
    return i['_source']; 
}); 
+0

Sì, questa è una buona idea per me.grazie, d'altra parte, non ho difficoltà a analizzarlo, questi dati non necessari dovrebbero essere postati dal cliente e consumare larghezza di banda e prestazioni lente un po '.. Mi chiedo solo che sia possibile o meno disattivare :) –

1

Basta usare il ElasticJS, l'API rec consigliato da ElasticSearch consentirà al client JS di comunicare facilmente con i nodi elasticsearch. Risparmierai un sacco di tempo usando questa API.

+1

Ho capito il tuo punto, se stavo iniziando potrei usarlo, ma ho solo bisogno di 2-3 tipi di ricerca, quindi non posso aggiungi una libreria esterna al progetto in questo momento. Ma la sua utile conoscenza ti ringrazia. –

1

Sì, è possibile rimuovere i campi aggiuntivi da sorgente_

risposta è solo una semplice parola filter_path

Curl:

curl -XGET 'http://localhost:9200/webproxylog/_search?filter_path=hits.hits._source' 

Nodo:

Se si utilizza qualsiasi nodo 'elasticsearch' è necessario aggiungere un solo parametro extrs filterPath

client.search({ 
     index: 'index', 
     type: 'type', 
     filterPath : ['hits.hits._source'], // this will remove extra fileds _index/_score/_id ... 
     body: { 
      sort: [ 
       {"posted_dt": {"order": "desc"}}, 
       "_score" 
      ], 
      query: query, 
      size: 50, 
      from: index * 50 
     } 
    } 

Nel tuo caso:

basta aggiungere quel campo in più in url:

"http://localhost:9200/webproxylog/_search?filter_path=hits.hits._source&source=" + query 
Problemi correlati