今天我遇到了ElasticSearch和jQuery的问题。我已经搜索了解决方案,但我找不到解决方案。
我想使用jQuery从ElasticSearch获取一些数据。它在我使用curl时起作用:
curl -XGET "http://localhost:9200/locations/_search?pretty=true" -d '
{
"sort": [
"_score",
{
"_geo_distance": {
"location": {
"lat" : 40.715,
"lon": -73.998
},
"order": "asc",
"unit": "km",
"distance_type": "plane"
}
}
]
}'
但是当我使用jQuery时它不起作用。我试过了:
var data = {
"query": {
"filtered": {
"filter": {
"geo_distance": {
"distance": "1km",
"location": {
"lat" : 40.715,
"lon": -73.998
}
}
}
}
}
}
$.ajax({
method: "GET",
url: "http://localhost:9200/locations/_search?pretty=true",
crossDomain: true,
async: false,
data: data,
dataType : 'json',
contentType: 'application/json',
})
.done(function( data ) {
console.log(data);
})
.fail(function( data ) {
console.log(data);
});
我尝试使用JSON.stringify(数据)传递数据,但它也不起作用。我甚至试图将方法从“GET”更改为“POST”,但没有结果。好吧,它正在发挥作用。 ElasticSearch返回一些位置的响应,但我的位置离我要求的位置很远。 40.715,-73.998位置是纽约,当我使用curl它返回纽约的位置,但是当我使用jQuery时,我在墨西哥获得位置,所以我认为我的“数据”变量被忽略了。我提到过我试过使用json.Stringify。是的,但它会返回错误:
Object { readyState: 0, getResponseHeader: .ajax/y.getResponseHeader(), getAllResponseHeaders: .ajax/y.getAllResponseHeaders(), setRequestHeader: .ajax/y.setRequestHeader(), overrideMimeType: .ajax/y.overrideMimeType(), statusCode: .ajax/y.statusCode(), abort: .ajax/y.abort(), state: .Deferred/e.state(), always: .Deferred/e.always(), catch: .Deferred/e.catch(),… }
那么,如何让它发挥作用?
答案 0 :(得分:0)
好的,问题解决了。我的代码没问题。我把方法改为“POST”。使用谷歌Chrome开发者工具我注意到代码的其他部分并不好。在我的代码中
"location": {
"lat" : 40.715,
"lon": -73.998
}
lat和lon是一个变量(我将它们更改为StackOverflow问题的coords)wchich是空的,因为我的代码的其他部分无法从getCurrentPosition()中分配新值(默认值为0,这就是为什么我的原因)代码不起作用)。因此,正确的代码版本是:
var data = {
"query": {
"filtered": {
"filter": {
"geo_distance": {
"distance": "1km",
"location": {
"lat" : lat,
"lon": lon
}
}
}
}
}
}
$.ajax({
method: "GET",
url: "http://localhost:9200/locations/_search?pretty=true",
crossDomain: true,
async: false,
data: JSON.stringify(data),
dataType : 'json',
contentType: 'application/json',
})
.done(function( data ) {
console.log(data);
})
.fail(function( data ) {
console.log(data);
});
请注意,lat和lon是需要参数为geopoint的变量