使用 Typescript、node 和 Express 滚动的索引弹性问题

Index elastic problem to scroll with Typescript, and with node and Express

我使用弹性搜索的 Javascript 客户端来索引和搜索我的数据,但我在使用滚动方法时遇到问题。

我无法设置正确的索引,但我知道我有正确的技术,因为在 Kibana 的 DevTools 控制台中我得到了正确的结果。

在 DevTools 中,我有以下有效的查询(我执行第一个请求,它是一个搜索,然后是第二个请求,它是一个滚动,通过提供第一个请求 returned 的 scrollId):

GET my_index-*/_search?scroll=1m
{
  "query": {
    "bool": {
      "filter": [{
        "match": {
          "field":"data"
        }
        },{
        "range": {
          "@timestamp": {
            "gte": "2020-05-08T10:00:00.100Z",
            "lte": "2022-05-11T10:00:00.200Z",
            "format": "strict_date_optional_time"
          }
        }
      }]
    }
  },
  "_source": {
    "includes": ["some_field1", "some_field2"]
  },
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    }
  ], 
  "size": 100
}

GET _search/scroll
{
  "scroll": "1m",
  "scroll_id":"DnF1ZXJ5VG ... NtUHdsQQ=="
}

这两个请求return预期的结果。

我的后端使用 Typescript 并使用 NodeJs 和 Express。

第一个请求,搜索,工作正常,return给我正确的结果。就是这个代码:

some import 
...

const client = new Client({
  node: configElasticClient.node
})

export const searchRouter = express.Router();

searchRouter.get('/search', async (req, res) => {
  const response = await client.search<SearchResponse<HitResult>>({
    index: "my_index-*",
    scroll: "1m",
    body: {
      query: {
        "bool": {
           "filter": [{
             "match": {
               "field_to_search":"data_to_search"
             }
             },{
            "range": {
              "@timestamp": {
                "gte": "2020-05-08T10:00:00.100Z",
                "lte": "2022-05-11T10:00:00.200Z",
                "format": "strict_date_optional_time"
             }
             }
           }]
         }
       },
      _source: ["some_field1", "some_field2"],
      sort: [
        {
          "@timestamp": {
            order: "desc"
          }
        }
      ], 
      size: 100
    }
  });
  console.log("result: ", response);
  res.json(response);
});

然后,当我制作滚动条时,我应该将索引更改为:“_search/scroll”。但无论我尝试什么,当我尝试使用滚动访问我的路线时,我都会收到“无法获取(路线)”错误。

这是第二条路线的代码(我在注释中尝试了另一种方式):

searchRouter.get('/search/scrollnext/:scrollId', async (req, res) => {
  const response = await client.scroll<SearchResponse<HitResult>>({
    scroll_id: req.params.scrollId,
    scroll: "1m",
    //index: "_search/scroll", wherever I put this field I get an error because the scroll method has no index field defined
  });

  //I also try this way :
  //const response = await client.scroll<SearchResponse<HitResult>>({
  //  method: 'GET',
  //  body: {
  //    scroll_id: req.params.scrollId,
  //    scroll: "1m",
  //}});

  console.log("result: ", response);
  res.json(response);
});

我从第一个请求中获取 scroll_id 作为参数,我在滚动函数中填写了第二个请求。

我认为我的问题出在滚动索引上,它一定是错误的。有谁知道如何修复滚动方法使用的索引?

任何帮助将不胜感激:)

终于找到答案了,语法很好,不是索引问题,我不得不在我的请求中添加一个异步管理层,如下所示:

searchRouter.get('/path/to/route/:scrollId', (asyncHandler(async (req, res) => {
  const response = await client.scroll<YourDataType>({
    scroll_id: req.params.scrollId,
    scroll: "1m",
  });
  res.json(response);
})));

asyncHandler 看起来像这样:

export function asyncHandler(fct: some_interface_to_define_request_caracteristic): RequestHandler {
    return (req, res, next) => {
       //Here add a try/catch layer
    }
}