使用jQuery / Ajax进行Elasticsearch查询

时间:2016-07-12 08:55:20

标签: jquery ajax elasticsearch

今天我遇到了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(),… }

那么,如何让它发挥作用?

1 个答案:

答案 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的变量