使用 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
}
}
我使用弹性搜索的 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
}
}