我需要使用Ajax进行弹性搜索查询。我要做的是搜索特定的类别名称,并返回与该类别相关联的名称列表。 Elastic Search中的结构是每个_source都有一个名称字段(类别的名称)和一个items字段。它还有name.raw,以便我可以按名称搜索。
这是我的要求:
var query = {
query: {
filtered: {
filter: {
term: { "name.raw": category }
}
}
}
}
$.ajax({
url: "http://192.168.0.240:9200/dropdowns/category/_search",
type: 'post',
dataType: 'json',
success: function(data) {
alert("Success");
},
error: function(data) {
// should be only one item in hits
$(data.hits.hits).each(function(index, hit) {
alert(hit._source.items);
});
},
data: query
});
现在,我正试图让它足够工作以提醒我点击中的项目。我收到了400 Bad Request错误。我的Ajax调用出了什么问题?
答案 0 :(得分:2)
在Jonathon Lerner的帮助下,我发现我的查询问题是它必须被字符串化。所以,我只是将其改为
data : JSON.stringify(query)
答案 1 :(得分:1)
使用以下代码:
var query = {
query: {
filtered: {
filter: {
term: { "name.raw": category }
}
}
}
};
$.ajax({
url: "http://192.168.0.240:9200/dropdowns/category/_search",
type: 'GET',
dataType: 'json',
success: function(data) {
console.log('Success');
$(data.hits.hits).each(function(index, hit) {
console.log(hit._source.items);
});
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(textStatus);
console.log(errorThrown);
},
data: query
});
您应该能够在Javascript控制台中使用查询调试问题,并查看成功的输出。以下是有关如何在不同浏览器中查看JS控制台的一些说明:https://webmasters.stackexchange.com/questions/8525/how-to-open-the-javascript-console-in-different-browsers
编辑:似乎这些指示专门用于Windows。我知道在Mac上,Command + Option + j打开Chrome JS控制台。我确定您的浏览器/操作系统不在此处,您可以在Google上找到正确的快捷方式。
答案 2 :(得分:1)
某些语言的HTTP库(尤其是Javascript)不允许GET请求拥有请求正文。
请参阅:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_empty_search.html
所以我认为在这里使用POST方法是正确的,你只是忘记对请求体进行字符串化。
答案 3 :(得分:0)
您应该能够使用GET方法通过以下语法在URL中发送查询:
var query = '{"query":{"filtered":{"filter:{"term":{"name.raw": category}}}}}';
$.ajax({
url: `http://192.168.0.240:9200/dropdowns/category/_search?
source_content_type=application/json&source=${query}`,
success: function(data) {
console.log(data);
}
});