【问题标题】:Javascript function to return Elasticsearch results返回 Elasticsearch 结果的 Javascript 函数
【发布时间】:2017-03-19 07:42:46
【问题描述】:

我正在尝试编写一个返回 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);
  });
}

【问题讨论】:

  • 我忽略了发布我的修复,抱歉:

标签: javascript elasticsearch callback


【解决方案1】:

我会在全局范围内的 client.search 函数之外实例化一个新数组,然后 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);
});

【讨论】:

  • 不幸的是,它没有这样做。您的方法复制了已经创建的 hits 数组 (var hits = resp.hits.hits;)。我可以遍历 hits[] 并将其内容打印到控制台,但如果我尝试 return hits; 我得到一个 Promise 对象,我无能为力。我希望有人能告诉我这个 Promise 对象是什么以及如何管理它。
【解决方案2】:

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

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

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

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

此调用返回一个 Promise。 如果我们将 handleResponse 视为您 then 中的函数

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。在该代码中,您正在处理数据。不要忘记您处于异步状态,您需要继续使用 Promise 来处理命中。

顺便说一句,在您的问题中,您使用“then”所做的是链接 Promise。有 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.
           })
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      相关资源
      最近更新 更多