我使用彈性搜索的 Javascript 客戶端來索引和搜索我的資料,但使用滾動方法時遇到問題。
我無法設定正確的索引,但我知道我擁有正確的技術,因為在 Kibana 的 DevTools 控制臺中我得到了正確的結果。
在 DevTools 中,我有以下有效的查詢(我執行第一個請求,即搜索,然后通過提供第一個請求回傳的 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=="
}
這兩個請求回傳預期的結果。
我的后端在 Typescript 中,并使用 NodeJs 和 Express。
第一個請求,搜索,正常作業并回傳正確的結果。就是這個代碼:
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 作為引數,我在滾動函式中填寫了我的第二個請求。
我認為我的問題來自滾動索引,這一定是錯誤的。有誰知道如何修復滾動方法使用的索引?
任何幫助將不勝感激 :)
uj5u.com熱心網友回復:
終于找到答案了,語法很好而且不是索引問題,我不得不在我的請求中添加一個異步管理層,如下所示:
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
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473326.html
