【问题标题】:Fetch data from elasticsearch in pieces using Node js使用Node js从elasticsearch中获取数据
【发布时间】:2018-03-07 15:55:20
【问题描述】:

我正在尝试使用 node js 从弹性中查询大量数据。 我有以下查询完美 -

client.search({
  "index": 'test',
  "size": 50,
  "type": consts.ReportType.VIOLATION,
  "body": searchQuery
}, callback);

我的主要目标是分段获取数据,每次只获得 50 个结果,因为我可能有数千个弹性文档。 我在客户端的页面中显示结果(比如 google 搜索结果),并且希望仅在需要时从弹性中获取更多数据。

那么,是否有可能维护一些索引来告诉 elastic 我已经得到的最后一个响应,并从该点获取另外 50 个结果?

谢谢

【问题讨论】:

    标签: node.js elasticsearch


    【解决方案1】:

    您可以使用pagination 来执行此操作。

    所以,在你的情况下,例如:

    client.search({
      "index": 'test',
      "from": 2,
      "size": 50,
      "type": consts.ReportType.VIOLATION,
      "body": searchQuery
    }, callback);
    

    【讨论】:

      【解决方案2】:

      为接下来的 50 个结果更改起始大小

      GET /_搜索 { “来自”:0,“大小”:50, “询问” : { “术语”:{“用户”:“泡菜”} } }

      https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html

      获取批量数据检查滚动apihttps://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-scroll

      【讨论】:

        【解决方案3】:

        更好的方法是使用 Elastic Scroll API

        【讨论】:

          【解决方案4】:

          你绝对可以使用分页来实现这一点,

           /**
           * 
           * @param {object} elasticClient 
           * @param {{index: string, scroll: string, size: number: body: object}} searchQuery 
           */
          async function* getRecords(elasticClient, searchQuery) {
            const response = await elasticClient.search(searchQuery);  
            const responseQueue = [];
            let counter = 0;
            
            responseQueue.push(response);
            while(responseQueue.length) {
              const { body } = responseQueue.shift();
          
              counter += body.hits.hits.length;
              for(const hit of body.hits.hits) {
                yield hit;
              }
          
              if (body.hits.total.value === counter) {
                break;
              }
              
              responseQueue.push(
                await elasticClient.scroll({
                  scrollId: body._scroll_id,
                  scroll: searchQuery.scroll
                })
              )
            }
          }
          

          然后你的查询

          const body = { query: {"match_all": {}} } };
          for await (const record of getRecords(elasticClient, {index: 'test', scroll: '30s', size: 100, body})) {
              console.log(record);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-06
            • 1970-01-01
            • 2021-07-10
            • 1970-01-01
            • 2020-01-25
            • 2019-08-11
            • 2020-07-01
            • 1970-01-01
            相关资源
            最近更新 更多