2016-11-30 3 views
0

Ich versuche, eine JavaScript-Funktion zu schreiben, die Ergebnisse einer Elasticsearch v5-Abfrage zurückgibt. Ich kann nicht herausfinden, wo und wie "Rückkehr" in diesem Code enthalten ist. Mit dem folgenden Befehl gibt segmentSearch (id) ein Promise-Objekt {_45: 0, _81: 0, _65: null, _54: null} zurück. _65 enthält ein Array der richtigen Treffer, aber ich kann nicht herausfinden, wie es zu analysieren ist. Das console.log (hits) erzeugt dasselbe Array, aber wie kann ich es von der Funktion zurückgeben?Javascript-Funktion zum Zurückgeben von Elasticsearch-Ergebnissen

var elasticsearch = require('elasticsearch'); 
var client = new elasticsearch.Client({ 
    host: 'localhost:9200', 
    log: 'trace' 
}); 

segmentSearch = function(id){ 
    var searchParams = { 
    index: 'myIndex', 
    type: 'segment', 
    body: { 
     query: { 
     nested : { 
      path : "properties", 
      query : { 
       match : {"properties.source" : id } 
      }, 
      inner_hits : {} 
     } 
     } 
    } 
    } 
    return client.search(searchParams).then(function (resp) { 
    var hits = resp.hits.hits; 
    console.log('hits: ',hits) 
    return hits; 
    }, function (err) { 
    console.trace(err.message); 
    }); 
} 
+0

ich vernachlässigte meine Verlegenheit zu schreiben, sorry: – kgeo

Antwort

0

würde ich ein neues Array außerhalb Ihrer client.search Funktion in globalem Bereich instanitate und Array.push Ihre ‚Hits‘ Ihr Array neu gefüllt zugreifen dann.

let newArr = []; 
client.search(searchParams).then(function (resp) { 
for(let i = 0; i < resp.hits.hits.length; i++){ 
newArr.push(resp.hits.hits[i]); 
} 
console.log('hits: ',newArr) 
return newArr; 
}, function (err) { 
console.trace(err.message); 
}); 
+0

, die es nicht tun, leider . Ihr Ansatz dupliziert das bereits erstellte Hits-Array ('var hits = resp.hits.hits;'). Ich kann durch hits [] iterieren und den Inhalt auf die Konsole drucken, aber wenn ich versuche, Treffer zurückzugeben, bekomme ich ein Promise-Objekt, mit dem ich nichts anfangen kann. Ich hoffe, dass mir jemand sagen kann, was das Promise-Objekt ist und wie es gehandhabt wird. – kgeo

0

Zunächst einmal ist Elasticsearch js Client mit Versprechen arbeiten (ich denke, mit Rückruf ist auch möglich).

Die Verwendung von Promise ist eine gute Möglichkeit, asynchrone Berechnungen zu verarbeiten.

Dieser Aufruf kehrt ein Versprechen
var search = function(id) 
{ 
    var searchParams = { /** What your search is **/} 
    return client.search(searchParams) 
} 

:

In Ihrer Frage, haben Sie schon etwas mit dem Versprechen gemacht. Wenn wir handeln wie die Funktion in Ihrem dann

var handleResponse = function(resp) 
{ 
    var hits = resp.hits.hits; 
    console.log('hits: ',hits) 
    return hits; //You could send back result here if using node 
} 

In Ihrem Code betrachten, handelte genannt wird, sobald das Versprechen Fullfield ist. Und in diesem Code verarbeiten Sie Daten. Vergiss nicht, dass du in asynchron bist, du musst weiter mit dem Versprechen arbeiten, mit Hits umzugehen.

Übrigens, in Ihrer Frage, was Sie getan haben, indem Sie "dann" verwendet, verkettet Promise. Es ist normal, Versprechen zu haben.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then Promise.prototype.then gibt ein Versprechen zurück.

var segmentSearch = function (id) 
{ 
    return search 
      .then(handleResponse //here you got your hit) 
      .then(function (hits) 
      { 
       console.log(hits) //and here you have done something with hits from search. 
      }) 
} 
0

ich vernachlässigte meine fix, traurig über das schreiben. Die Sequenz ist searchParams zu erstellen, führt client.search (searchParams), die ein Versprechen des Treffers zurückgibt, dann wird diese Treffer verarbeiten:

segmentSearch = function(obj){ 
    // retrieve all segments associated with a place, 
    // populate results <div> 
    let html = '' 
    var plKeys = Object.keys(obj) 
    var relevantProjects = [] 

    for(let i = 0; i < plKeys.length; i++){ 
    relevantProjects.push(obj[plKeys[i]][0]) 

    var searchParams = { 
    index: 'myIndex', 
    type: 'segment', 
    body: { 
     query: { 
     nested : { 
      path : "properties", 
      query : { 
       match : {"properties.source" : id } 
      }, 
      inner_hits : {} 
     } 
     } 
    } 
    } 

    client.search(searchParams).then(function (resp) { 
    return Promise.all(resp.hits.hits) 
    }).then(function(hitsArray){ 
    ...write html to a <div> using hits results 
    } 
} 
Verwandte Themen