【问题标题】:Size of Elasticsearch query from Apollo GraphQL client is always ten来自 Apollo GraphQL 客户端的 Elasticsearch 查询的大小始终为 10
【发布时间】:2020-01-23 12:37:26
【问题描述】:

我使用 GraphQL 作为后端到前端的通信,并使用 Elasticsearch 作为我的数据库。问题是,每当我从前端调用查询时,尽管我在查询中将大小指定为 1000,但大小始终为 10。当我使用返回正确命中数的 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 个结果?

【问题讨论】:

  • 首先,由于您只对聚合感兴趣,因此您应该在搜索查询中设置size: 0 而不是size: 1000。唯一重要的大小是您术语聚合中的大小。然后不清楚 res 变量可能包含在您的 return 语句中,因为它没有在任何地方定义。
  • @Val 我最初将搜索查询的大小设置为 0。我只是在尝试以防万一。我还用res 更新了我的代码。
  • 你能listen to the request event 打印出实际发送的请求吗?
  • 谢谢,您现在可以直接在开发工具或 curl 中运行该原始查询并查看您获得了多少存储桶吗?
  • @Val 我得到了 10 个桶。

标签: javascript elasticsearch graphql apollo react-apollo


【解决方案1】:

默认情况下,Elasticsearch 的结果数为 10。 您需要指定多少个结果(我相信有 Max:10k?)

大小的位置很重要,应该在你请求的body中:

请看这里: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-from-size

【讨论】:

  • 你读过这个问题吗?尺寸已经指定。它只从前端返回十个,而不是在其他情况下。
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 2020-10-25
  • 2016-08-31
  • 2019-11-02
  • 2018-03-25
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
相关资源
最近更新 更多