Node+ElasticSearch: отправка тела по запросу GET?
Я использую Node.js и request
модуль для создания бэкэнда, и мы выбрали Elasticsearch в качестве хранилища данных. Пока все в порядке, за исключением того, что Node не поддерживает тела запросов для запросов GET? Это необходимо для Elasticsearch's _search
API, который ожидает только GET-запросы как часть их семантического дизайна. Есть ли решение, чтобы заставить Node отправлять тело запроса даже в случаях запроса GET, или способ использования _search
на Elasticsearch с другим HTTP-глаголом?
function elasticGet(url, data) {
data = data || {};
return Q.nfcall(request.get, {
uri: url,
body: JSON.stringify(data) //<-- noop
}).then(function(response) {
return JSON.parse(response[1]);
}, function(err) {
console.log(err);
});
}
2 ответа
Для простоты, почему бы не использовать их API, а не делать запросы вручную?
простой пример:
var elasticsearch = require('elasticsearch'),
client = new elasticsearch.Client({
host: '127.0.0.1:9200',
log: 'trace'
});
client.search({
index: '[your index]',
q: 'simple query',
fields: ['field']
}, function (err, results) {
if (err) next(err);
var ids = []
if (results && results.hits && results.hits.hits) {
ids = results.hits.hits.map(function (h) {
return h._id;
})
}
searchHandler(ids, next)
})
Вы можете комбинировать его с полнофункциональными лабораторными программами astic.js для создания действительно сложных запросов, действительно быстрых. https://github.com/fullscale/elastic.js
У меня была такая проблема несколько дней назад.
tld;dr использовать POST
Согласно https://www.elastic.co/guide/en/elasticsearch/guide/current/_empty_search.html, вы также можете использовать POST с эластичными.
Я пробовал с axios, но он возвращает все данные как без тела. Поэтому вместо этого я использовал POST. У меня это работает, и я надеюсь, что это поможет кому-то другому.