본문 바로가기
컴퓨터 프로그래밍/Node.js

[Node.js] search index

by 한33 2023. 11. 18.

게시물이 몇 개 밖에 없을 땐 몰라도 만약 게시물 수가 엄청 많다면

 

검색결과 기능을 만들어도 검색하는데에 시간이 오래 걸릴 것이다.

 

검색을 하면 게시물 1000개 가 있다고 가정할 시에 그 1000개를 모두 훑고 나서 검색결과를 띄워주기 때문인데

 

이를 해결하기 위해서 search index 기능을 이용한다.

 

app.get('/search', async (요청, 응답) => {
  let 검색조건 = [
    {$search : {
      index : '사용할 인덱스 이름',
      text : { query : '검색어', path : '검색할 필드이름' }
    }}
  ]
  let result = await db.collection('post').aggregate(검색조건).toArray()
  응답.render('search.ejs', { 글목록 : result })
})

 

1. aggregate() 안에는 [{조건1}, {조건2} … ] 이런 식으로 검색조건을 여러개 집어넣을 수 있습니다.

2. $search 연산자를 쓰면 search index를 이용해서 검색을 해옵니다.

3. $search 쓰려면 인덱스 이름, 검색어, 어떤 필드에서 검색할지 잘 채우면 끝입니다.

 

let 검색조건 = [
  {$search : {
    index : '사용할 인덱스 이름',
    text : { query : '검색어', path : '검색할 필드이름' }
  }},
  { $sort : { _id : 1 } },
  { $limit : 10 },
  { $project : { 제목 : 1, _id : 0 } }
]

 

- $sort 쓰면 검색 결과를 정렬해주는데 _id를 기입하면 _id 순으로 정렬해줍니다.

안쓰면 기본적으로 score 순으로 정렬됨

 

- $limit쓰면 결과를 제한해줍니다. 검색결과 중에 맨 위의 10개 document만 가져올 수 있습니다. 

당연히 { $skip : 5 } 이거 연산자도 쓸 수 있습니다. 그래서 이런거 쓰면 페이지네이션도 구현가능

 

- $project쓰면 찾아온 결과 중에 원하는 필드만 가져오라고 걸러줄 수 있습니다. 

예를 들어 {title : 1, content : 0} 이러면 title은 보여줌, content는 숨김이라는 뜻입니다.

 

나중에 검색결과 페이지네이션 기능을 만들 때 다시 참고해서 개발하면 되겠다. 

 

skip 연산자와 limit 연산자를 이용해보자