Javascript函数返回Elasticsearch结果

时间:2016-11-30 12:58:54

标签: javascript elasticsearch callback

我试图编写一个返回Elasticsearch v5查询结果的JavaScript函数。我无法弄清楚在哪里以及如何包含' return'在这段代码中。通过以下内容,segmentSearch(id)返回一个Promise对象{_45: 0, _81: 0, _65: null, _54: null}。 _65包含正确命中的数组,但我无法弄清楚如何解析它。 console.log(hits)生成相同的数组,但是如何从函数中返回它?

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);
  });
}

3 个答案:

答案 0 :(得分:1)

我会在你的client.search函数之外的全局范围和阵列中实现一个新数组。赶快你的命中'然后访问新填充的数组。

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);
});

答案 1 :(得分:0)

首先,elasticsearch js客户端正在使用Promise(我认为使用回调也是可能的)。

使用Promise是处理异步计算的好方法。

在你的问题中,你已经做了一些承诺:

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

此调用正在返回Promise。 如果我们将handleResponse视为您当时的函数

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

在你的代码中,一旦promise为fullfield,就会调用handleResponse。在该代码中,您正在处理数据。不要忘记你处于异步状态,你需要继续努力处理命中。

顺便说一句,在你的问题中,你通过使用&#34;然后&#34;做了什么。是链接承诺。承诺是正常的。

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.
           })
}

答案 2 :(得分:0)

我忽略了发布我的修复,抱歉。顺序是创建searchParams,执行client.search(searchParams),返回命中的Promise,然后处理这些命中:

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