Elasticsearch地理空间搜索,索引设置问题

时间:2015-06-15 12:46:29

标签: elasticsearch geospatial

我正在尝试搜索以前添加到索引的文档,该索引已配置为允许地理空间查询(或者我认为)。
我的elasticsearch实例托管在qbox.io上。

这是我用来从命令行创建索引的代码

curl -XPOST username:password@instance-id.qbox.io/events -d '{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
      "mygeopoints": {
        "properties": {
          "geopoint": {
            "type": "geo_point",
            "lat_lon" : true
          },
          "radius": {
            "type": "long"
          }
        }
      }
    }
  }'

正如我所理解的那样,我应该在我的events索引和我想要对其执行的搜索类型之间创建一个映射。

这是我编写的用于创建测试文档的代码:

var elasticsearch = require('elasticsearch');
var client = new elasticsearch.Client({
  host: 'username:password@instance-id.qbox.io'
});

client.create({
  index: 'events',
  type: 'geo_point',
  body: {
    location: {
      lat: 51.507351,
      lon: -0.127758
    }
  }
}, console.log);

这是我编写的用于搜索给定半径

的文档的代码
var elasticsearch = require('elasticsearch');
var client = new elasticsearch.Client({
  host: 'username:password@instance-id.qbox.io'
});

client.search({
  filtered: {
    query: {
      match_all: {}
    },
    filter: {
      geo_distance: {
        distance: '1km',
        location: {
          lat: 48.507351,
          lon: -0.127758
        }
      }
    }
  }
}, console.log);

我的问题是event索引的所有文档总是显示出来,所以我没有使用地理空间查询成功过滤;你发现任何错误,或者你有什么指导我可以遵循这样做吗?我搜索过,只发现了一些信息。

1 个答案:

答案 0 :(得分:1)

您的代码中存在几个问题:

问题1:当您在第二个代码段中创建文档时,您没有使用正确的映射类型,并且您的正文并未包含正确的字段名称你的映射:

client.create({
  index: 'events',
  type: 'geo_point',     <-------- wrong type
  body: {
    location: {          <-------- wrong field name
      lat: 51.507351,
      lon: -0.127758
    }
  }
}, console.log);

由于在您的映射类型中,您声明的类型称为mygeopointsgeo_point字段称为geopoint,因此您的create调用必须使用它们像这样:

client.create({
  index: 'events',
  type: 'mygeopoints',
  body: {
    geopoint: {
      lat: 51.507351,
      lon: -0.127758
    }
  }
}, console.log);

问题2: search call中的参数哈希不正确,因为您的查询DSL需要分配到body参数(类似于您的create }调用)并且最好添加index参数来集中搜索(参见下文)

问题3:最后,在您的查询中,您未使用geo_distance过滤条件中的相应字段,而是location而不是{{1} }。您的查询应如下所示:

geopoint