개발자

엘라스틱서치 무한스크롤 관련 질문

2023년 04월 19일조회 125

Express 연동해서 search 메서드로 search_after 사용해서 무한 스크롤 구현중입니다. 궁금한 점은 인덱스 안에 로그가 99개가 있다고 하면 size 10으로 했을 때 search_after로 9번까지는 데이터를 잘 가져오는데 마지막에 로그 호출할 때는 에러가 뜹니다.. 마지막 호출에서 이게 마지막이라고 감지하도록 만들고 싶은데 혹시 방법이 있을까요??

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

동호님의 프로필 사진

조금 간단하게 접근해보겠습니다! size가 10인 요청인데 9개의 요청이 왔다면, 마지막 인덱스 라는 의미가 아닐지 생각해보세요 :) 또한, Express를 사용해보지 않아 잘 모르지만, ElasticSearch는 Size에서 Index보다 초과하게 [GET/POST(QueryMethod)] 요청 되었을 경우 아무런 반환값도 나오지 않습니다!(정확히는, 일치하는 결과가 없다고 Json으로 출력해줍니다.) Express에서 에러를 내뱉도록 내부적으로 동작하는 것 같은데, 그 부분을 예외처리 하는것도 또 하나의 방법이겠네요 :)-

커리어리 AI 봇님의 프로필 사진

엘라스틱서치에서 무한 스크롤을 구현할 때 마지막 페이지를 감지하는 방법은 다음과 같이 처리할 수 있습니다. 1. 결과 개수 확인하기: 'size'로 요청한 데이터 개수보다 실제로 받은 데이터 개수가 적다면, 마지막 페이지로 간주할 수 있습니다. 예를 들어, 'size'가 10개이고 받은 데이터가 7개라면, 마지막 페이지입니다. 2. 'total' 값 확인하기: 검색 결과의 'total' 값을 확인하여, 얼마나 많은 결과가 남아있는지 확인할 수 있습니다. 요청한 'size'와 'from' 값을 더해서 'total' 값보다 크거나 같다면, 마지막 페이지입니다. 이 두 가지 방법을 사용하여 마지막 페이지를 감지하고, 이에 따라 클라이언트 측에서 무한 스크롤이 중지되도록 구현할 수 있습니다. 다만, 'search_after'를 사용할 경우 첫 번째 방법이 더 적합합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#1
const { body } = await client.search({
  index: 'your_index',
  size: 10,
  body: {
    query: {
      // your query
    },
    search_after: [search_after_value], // search_after value from previous search
    sort: [
      // your sort condition
    ]
  }
});

if (body.hits.hits.length < 10) {
  // 마지막 페이지입니다.
}


#2
const { body } = await client.search({
  index: 'your_index',
  size: 10,
  from: offset, // offset value based on the current page
  body: {
    query: {
      // your query
    },
    sort: [
      // your sort condition
    ]
  }
});

if (offset + 10 >= body.hits.total.value) {
  // 마지막 페이지입니다.
}

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!