Как передать полезную нагрузку для упругого поиска. - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь получить записи для определенного индекса, я могу получить 10 записей по умолчанию на вызов.

Однако я бы тоже хотел передать дополнительные параметры тела, чтобы я мог выполнить некоторую фильтрацию и ограничение записей.

После перехода по этой ссылке, вот код, который я использую,

    body = '{size:100}'
    payload_hash = OpenSSL::Digest.new("sha256").hexdigest(body)

    url = "https://myhost/index_name/_search"
    signer = Aws::Sigv4::Signer.new(
      service: 'es',
      region: 'us-west-1',
      access_key_id: 'access_key',
      secret_access_key: 'secret_key'
    )

    uri
     = URI(url)

    t = Time.now.utc
    amzdate = t.strftime('%Y%m%dT%H%M%SZ')
    datestamp = t.strftime('%Y%m%d')

    headers = {
      "host"=>'myhost',
      "x-amz-date" => amzdate,
      "x-amz-content-sha256" => body
    }

    signature = signer.sign_request(
      http_method: 'POST',
      url: url,
      headers: headers,
      body: body
    )


    require 'uri'
    require 'net/http'

    url = URI("https://myhost/index_name/_search")

    http = Net::HTTP.new(url.host, url.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    request = Net::HTTP::Post.new(url, 'size' => '100'})
    request["host"] = signature.headers['host']
    request["x-amz-content-sha256"] = signature.headers['x-amz-content-sha256']
    request["x-amz-date"] = signature.headers['x-amz-date']
    request["authorization"] = signature.headers["authorization"]
    response = http.request(request)
    result =  response.read_body
    result = JSON.parse(result)
    result["hits"]["hits"].count

Я всегда получаю только 10 записей. Я прочитал много документации для net http тоже. Не знаю, что я здесь делаю не так.

1 Ответ

0 голосов
/ 03 мая 2018

Я только что нашел решение, разместив его ниже для будущих запросов

Я добавлял тело по запросу, как request['body'], которое устанавливало его в качестве заголовка. Правильным способом было передать тело json в хэш подписи и установить метод тела объекта запроса.

    body = {"size": 1000}
    payload_hash = OpenSSL::Digest.new("sha256").hexdigest(body)

    url = "https://my-host/my-index/_search"
    signer = Aws::Sigv4::Signer.new(
      service: 'es',
      region: 'us-west-1',
      access_key_id: 'accesss_key',
      secret_access_key: 'secret_key',
      apply_checksum_header: false
    )

    uri
     = URI(url)

    t = Time.now.utc
    amzdate = t.strftime('%Y%m%dT%H%M%SZ')
    datestamp = t.strftime('%Y%m%d')

    headers = {
      "host"=>'my-host',
      "x-amz-date" => amzdate
    }

    signature = signer.sign_request(
      http_method: 'POST',
      url: url,
      headers: headers,
      body: body.to_json
    )


    require 'uri'
    require 'net/http'

    url = URI("https://my-host/my-index/_search")

    http = Net::HTTP.new(url.host, url.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    request = Net::HTTP::Post.new(url)
    request["host"] = signature.headers['host']
    request["x-amz-date"] = signature.headers['x-amz-date']
    request["authorization"] = signature.headers["authorization"]
    request.body = body.to_json
    response = http.request(request)
    result =  response.read_body
    result = JSON.parse(result)
    result["hits"]["hits"].count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...