我正在尝试搜索以前添加到索引的文档,该索引已配置为允许地理空间查询(或者我认为)。
我的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
索引的所有文档总是显示出来,所以我没有使用地理空间查询成功过滤;你发现任何错误,或者你有什么指导我可以遵循这样做吗?我搜索过,只发现了一些信息。
答案 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);
由于在您的映射类型中,您声明的类型称为mygeopoints
而geo_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