Elasticsearch:cURL到Ajax请求
我正在使用弹性搜索的Ajax请求来获取搜索结果。 最后,我找到了我必须要查询的查询。 (这是一个后续问题链接 )
这是cURL中的查询:
[~]$ curl -XGET 'localhost:9200/firebase/_search?pretty' -H 'Content-Type: application/json' -d' > {"query": {"match": {"song": {"query": "i am in", "operator": "and"}}}}'
结果:
{ "took" : 286, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.8630463, "hits" : [ { "_index" : "firebase", "_type" : "song", "_id" : "0001", "_score" : 0.8630463, "_source" : { "song" : "i am in california", "song_name" : "hello", "song_url" : "https://s3.ap-south-1.amazonaws.com/..." } } ] } }
这个查询给我的结果正是我需要的。 当我使用与AJAX相同的请求时,它给了我一个糟糕的请求。
Ajax.js
情况1:
$(function() { $('#message').keyup(function() { var query = { "query": { "match": { "song": { "query": $("#message").val(), "operator": "and" } } } }; console.log(JSON.stringify(query)); $.ajax({ type: "GET", url: "http://localhost:9200/firebase/_search", contentType: 'application/json', data: query, success: searchSuccess, dataType: 'json' }); }); });
控制台中的结果:
案例2 :如果我使用JSON.stringify转换’数据’,它会给我:
案例3 :如果我将查询结构更改为如下并在’data’上使用JSON.stringify:
var query = { query: { match: { song: { query: $("#message").val(), operator: "and" } } } };
结果是:
我不确定这里的问题是什么,查询是正确的,因为使用相同的cURL我在bash中得到了正确的结果。 问题是如何在这里正确创建Ajax请求。 指针将不胜感激。
编辑 :是的,我在elasticsearch.yml中启用了CORS:
http.cors.enabled : true http.cors.allow-origin : "*" http.cors.allow-methods : OPTIONS, HEAD, GET, POST, PUT, DELETE http.cors.allow-headers : X-Requested-With,X-Auth-Token,Content-Type, Content-Length
Edit1 :Chrome,下方的网络数据,以便提供更多信息:
Edit2 :完整的错误响应如下:
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/firebase/_search] contains unrecognized parameters: [query[match][song][operator]], [query[match][song][query]]"}],"type":"illegal_argument_exception","reason":"request [/firebase/_search] contains unrecognized parameters: [query[match][song][operator]], [query[match][song][query]]"},"status":400}
根据我的经验,GET方法与身体的行为有时难以预测。 实际上,弹性搜索支持GET与body,但我也有一些奇怪的结果,具体取决于服务器,代理等的配置…文档甚至突出了javascript( 使用GET搜索 )的问题。
通常,使用POST而不是GET有助于解决这些问题,或者至少有一个进一步的调试选项。