Размер запроса Elasticsearch от клиента Apollo GraphQL всегда равен десяти - PullRequest
2 голосов
/ 23 сентября 2019

Я использую GraphQL в качестве внутреннего интерфейса для связи с внешним интерфейсом, а Elasticsearch - в качестве базы данных.Проблема заключается в том, что всякий раз, когда я вызываю запрос из внешнего интерфейса, размер всегда равен десяти, несмотря на то, что в запросе я указываю размер как 1000. Это происходит, когда я использую игровую площадку GraphQL, которая возвращает правильное количество совпадений.

Мой запрос на поиск ES:

async rangeSessions(_, args) {
  const { dateFrom, dateTo } = args;      

  const results = await client.search({
    index: 'logs-cdigm',
    size: 1000,
    body: {
      aggs: {
        sessions: {
          terms: {
            field: 'session_id.keyword',
            size: 1000
          },
          aggs: {
            start_time: { min: { field: 'ts' } },
            end_time: { max: { field: 'ts' } },
            events_count: { value_count: { field: 'sequence_id' } },
          },
        },
      },
      query: {
        range: {
          timestamp: {
            lte: dateTo * 1000000,
            gt: dateFrom * 1000000,
          },
        },
      },
    },
  });

  const res = [];    
  console.log(results.body.aggregations.sessions.buckets.length);

  results.body.aggregations.sessions.buckets.forEach((bucket) => {
    res.push({
      session_id: bucket.key,
      events_count: bucket.doc_count,
      start_time: bucket.start_time.value_as_string,
      end_time: bucket.end_time.value_as_string,
    });
  });

  return res;
}

Мой запрос GraphQL:

query sessionSearch ($from: Float!, $to: Float!) {
  rangeSessions(dateFrom: $from, dateTo: $to) {
    session_id
    start_time
    end_time
    events_count
  }
}

Мой запрос:

// from frontend
{"operationName":"sessionSearch","variables":{"from":1567555200000,"to":1567728000000},"query":"query sessionSearch($from: Float!, $to: Float!) {\n  rangeSessions(dateFrom: $from, dateTo: $to) {\n    session_id\n    start_time\n    end_time\n    events_count\n    __typename\n  }\n}\n"}


{
  body: null,
  statusCode: null,
  headers: null,
  warnings: null,
  meta: {
   context: null,
    request: { params: [Object], options: [Object], id: 2 },
    name: 'elasticsearch-js',
    connection: {
      url: 'http://localhost:9200/',
      id: 'http://localhost:9200/',
      headers: {},
      deadCount: 0,
      resurrectTimeout: 0,
      _openRequests: 0,
      status: 'alive',
      roles: [Object]
    },
    attempts: 0,
    aborted: false
  }
}

// request object
{
  params: {
    method: 'POST',
    path: '/logs-cdigm/_search',
    body: '{"aggs":{"sessions":{"terms":{"field":"session_id.keyword","size":1000},"aggs":{"start_time":{"min":{"field":"ts"}},"end_time":{"max":{"field":"ts"}},"events_count":{"value_count":{"field":"sequence_id"}}}}},"query":{"range":{"timestamp":{"lte":1567728000000000000,"gt":1567555200000000000}}}}',
    querystring: 'size=1000',
    headers: {
      'User-Agent': 'elasticsearch-js/7.3.0 (linux 4.15.0-64-generic-x64; Node.js v12.10.0)',
      'Content-Type': 'application/json',
      'Content-Length': '293'
    }
  },
  options: { warnings: null },
  id: 2
}

Как сделатьЯ получил более 10 результатов в моем интерфейсе?

1 Ответ

1 голос
/ 23 сентября 2019

Elasticsearch количество результатов по умолчанию равно 10. Вам нужно указать, сколько результатов (есть максимум: 10k, я полагаю?)

Место размера важно, оно должно быть в тело вашего запроса:

Смотрите здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-from-size

...