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 ответа

Решение

_search API также принимает POST глагол.

Для простоты, почему бы не использовать их 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. У меня это работает, и я надеюсь, что это поможет кому-то другому.

Другие вопросы по тегам