【问题标题】:Making an Elastic Search filtered query in Ajax在 Ajax 中进行弹性搜索过滤查询
【发布时间】:2014-09-29 12:34:05
【问题描述】:

我需要使用 Ajax 进行 Elastic Search 查询。我要做的是搜索特定的类别名称,并返回与该类别关联的名称列表。 Elastic Search 中的结构是每个 _source 都有一个 name 字段(类别的名称)和一个 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 错误请求错误。我的 Ajax 调用出了什么问题?

【问题讨论】:

  • 你的ajax请求类型不应该是get吗?
  • 我认为您的 AJAX 调用没有任何问题。如果您的查询不正确,Elasticsearch 会返回 400。您应该在错误函数中查看 data 以了解您的查询问题。它可能与不正确的映射有关,因为您正在尝试进行嵌套搜索。此外,data.hits.hits 只会成功。错误永远不会返回命中。
  • 对,那么查询有什么问题?
  • 从我所见,本质上没有任何东西。您需要在error 回调中将错误消息记录到控制台,以查看弹性搜索服务器告诉您的内容。如果您想轻松测试查询,请使用 curl 或 Elasticsearch Sense elasticsearch.org/guide/en/marvel/current/#_sense
  • 对不起,我是新手,你能告诉我怎么做吗?如何将错误消息记录到控制台?

标签: ajax search post filter elasticsearch


【解决方案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 上找到正确的快捷方式。

【讨论】:

  • 好的,所以当我运行 GET 时我获得了成功,但是 GET 返回所有类别,而不仅仅是我正在寻找的类别。当我做 POST 时,它失败了,但控制台并没有告诉我为什么它失败了;它只是说“错误的请求”
  • 控制台应该在失败时记录两个不同的东西。至于为什么当你使用 GET 时它返回的结果比你想要的多……我必须查看你的映射、一些示例文档等才能真正调试弹性搜索查询。
【解决方案2】:

在 Jonathon Lerner 的帮助下,我发现我的查询的问题在于它必须被字符串化。所以,我只是将其更改为

data : JSON.stringify(query)

【讨论】:

    【解决方案3】:

    某些语言(尤其是 Javascript)的 HTTP 库不允许 GET 请求具有请求正文。

    看到这个:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_empty_search.html

    所以我认为这里使用 POST 方法是正确的,你只是忘记对请求正文进行字符串化。

    【讨论】:

      【解决方案4】:

      您应该能够使用 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);
              }
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 2016-03-02
        • 1970-01-01
        相关资源
        最近更新 更多