在Ajax中进行Elastic Search筛选查询

时间:2014-08-06 14:13:07

标签: ajax search post filter elasticsearch

我需要使用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调用出了什么问题?

4 个答案:

答案 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);
        }
    });