如何在ExpressJS

时间:2015-06-30 11:18:18

标签: node.js express elasticsearch geolocation

点击

{
    "_index" : "users",
    "_type" : "user",
    "_id" : "001",
    "_score" : 1,
    "_source" : {
      "utype" : "user",
      "username" : "test",
      "location" : {
          "lat" : 0.1,
          "lon" : 0.0
      },
      "uid" : "001"
    }
}

Node.js - app.js

client.search({
    index: 'users',
    type: 'user',
    body: {
        query: {
            filtered: {
                query: {
                    match_all: {}
                },
                filter: {
                    geo_distance: {
                        distance: '2km',
                        location: {
                            lat: 0.0,
                            lon: 0.1
                        }
                    }
                }
            }
        }
    }
}).then(function (response) {
    var hits = response.hits.hits;
    console.log(hits);
}, function (error, response) {
    // ...
});

错误

  

"错误":" SearchPhaseExecutionException [无法执行阶段[query_fetch],所有分片都失败; shardFailures

...我不确定我是否正确使用 geo_distance ,但我确实使用了 elasticsearch 文档中使用的相同格式。我使用ExpressJS安装了elasticsearch npm,并使用上面的client.search代码进行geo_distance过滤。而且命中不仅返回一个对象。任何人都可以帮助我如何使这项工作?谢谢!

1 个答案:

答案 0 :(得分:1)

您必须删除第一个查询并将“location”替换为“user.location”,因为ElasticSearch会将其解释为类似于属性的类型。

 client.search({
    index: 'users',
    body: {
          filter: {
              geo_distance: {
                   distance: '2km',
                   location: {
                       lat: 0.0,
                       lon: 0.1
                   }
              }
         }
   }               
}).then(function (response) {
    var hits = response.hits.hits;
    console.log(hits);
}, function (error, response) {
    // ...
});

我希望它可以帮到你。