2014-08-06 3 views
0

Мне нужно выполнить запрос Elastic Search с помощью Ajax. Я пытаюсь выполнить поиск определенного имени категории и вернуть список имен, связанных с этой категорией. Структура в Elastic Search состоит в том, что каждый _source имеет поля имени (название категории) и поля элементов. У него также есть name.raw, чтобы я мог искать по точному имени.Создание отфильтрованного запроса на фильтрацию в Ajax

Это моя просьба:

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

Не должен ли ваш тип запроса ajax быть 'get'? –

+0

Я не думаю, что что-то не так с вашим звонком AJAX. Elasticsearch возвращает 400, если ваш запрос плох. Вы должны смотреть на «данные» в своей функции ошибок для проблемы с вашим запросом. Вероятно, это связано с неправильным отображением, поскольку вы пытаетесь выполнить вложенный поиск. Кроме того, 'data.hits.hits' будет успешным. Ошибка никогда не будет возвращать хиты. –

+0

Правильно, так что случилось с запросом? –

ответ

1

С помощью Джонатона Лернера я выяснил, что проблема с моим запросом заключалась в том, что он должен быть сжатым. Таким образом, я просто изменил его

data : JSON.stringify(query) 
0

Используя следующий код:

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.

+0

ОК, поэтому я получаю успех, когда я запускаю GET, но GET возвращает ВСЕ категории, а не только тот, который я ищу. Когда я делаю POST, он терпит неудачу, но консоль не говорит мне, почему она терпит неудачу; он просто говорит «плохой запрос» –

+0

Консоль должна регистрировать две разные вещи при сбое. С точки зрения того, почему он возвращает больше, чем вы хотите, когда вы используете GET ... Мне нужно будет увидеть ваше сопоставление, некоторые образцы документов и т. Д., Чтобы иметь возможность фактически отлаживать запрос elasticsearch. –

2

HTTP-библиотеки некоторых языков (в частности, Javascript) не позволяют запросы GET иметь тело запроса.

Смотреть это: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_empty_search.html

Так что я думаю, что это правильно использовать метод POST здесь, вы просто забыли stringify тело запроса.

Смежные вопросы