2016-11-30 1 views
0

Elasticsearch v5 쿼리의 결과를 반환하는 JavaScript 함수를 작성하려고합니다. 나는이 코드에 'return'을 어디에서 어떻게 포함 시킬지를 알 수 없다. 다음으로 segmentSearch (id)는 Promise 객체 인 {_45: 0, _81: 0, _65: null, _54: null}을 반환합니다. _65에는 정확한 히트 배열이 있지만 구문 분석 방법을 알 수 없습니다. console.log (조회수)는 동일한 배열을 생성하지만 어떻게 함수에서 반환 할 수 있습니까?Elasticsearch 결과를 반환하는 자바 스크립트 함수

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

내 수정을 게시 무시 : 순서는 다음 해당 안타 처리, 히트의 약속을 반환 client.search (searchParams)을 수행, searchParams를 만드는 것입니다 – kgeo

답변

0

나는 그런 다음 새로 작성 배열에 액세스 전역 범위에 client.search 기능 이외의 새로운 배열을 instanitate하고 '히트'사항 Array.push 것이다.

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

불행하게도, 그것을하지 않는 . 당신의 접근법은 이미 생성 된 히트 배열을 복제한다 ('var hits = resp.hits.hits;'). 히트 []를 반복하고 그 내용을 콘솔에 출력 할 수는 있지만, 히트를 반환하려고하면 나는 무엇이든 할 수없는 Promise 객체를 얻습니다. 나는 Promise 객체가 무엇인지, 어떻게 관리 할 지 누군가가 나에게 말할 수 있기를 바라고있다. – kgeo

0

먼저, elasticsearch JS 클라이언트가 약속과 협력 (I 콜백을 사용하여 생각도 가능).

Promise를 사용하면 비동기 계산을 처리하는 좋은 방법입니다. 귀하의 질문에

, 당신은 이미 약속 짓을 한 :

var search = function(id) 
{ 
    var searchParams = { /** What your search is **/} 
    return client.search(searchParams) 
} 

이 호출은 약속을 반환합니다. 에서 우리가 함수로 handleResponse을 고려하면 당신의 약속이 fullfield되면 다음 코드에서

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

이 handleResponse가 호출됩니다. 그리고 그 코드에서 당신은 데이터를 처리하고 있습니다. 당신이 비동기 적이라는 것을 잊지 마십시오. 히트 처리에 대한 약속을 지킬 필요가 있습니다.

"그렇다면"을 사용하여 수행 한 작업은 약속을 연결하는 것입니다. Promise를 갖는 것은 정상입니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then Promise.prototype.then은 Promise를 반환합니다.

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

수정 사항을 게시하지 않으려 고 죄송합니다. 죄송합니다,

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 
    } 
} 
관련 문제