본문 바로가기

코딩/NodeJS

nodejs랑 mongodb에서 검색 기능 최적화하기(2)

반응형

1. 개요

  • text-index를 만들어두면 검색이 쉬워짐
    • ‘or’ 연산자나 ‘-’ 연산자 같은거 사용 가능
    • 부분 검색어로 검색 가능
  • 근데 text-index는 단점이 있음
    • 단어 일부만 검색하면 검색이 안됨
    • mongodb는 띄어쓰기 기준으로 인덱싱 해주기 때문

2. Search Index 쓰기

  • mongodb atlas에서 search index 만들기

  • index Name 짓고
  • 인덱스를 적용할 collection을 선택해야 함

  • [Refine Your Index]를 클릭하고,

  • lucene.korean으로 변경합시다

  • 그 밑에 있는 [Add Field Mapping]버튼을 눌르세여

  • Field Name은 제목으로 지정해주세여

3. 코드

// 검색 기능
app.get("/search", (요청, 응답) => {
  // aggrigate에 들어갈 검색조건 만들기
  var 검색조건 = [
    {
      $search: {
        // 인덱스 이름
        index: "titleSearch",
        // 실제 검색 요청하는 부분
        text: {
          // 검색어
          query: 요청.query.value,
          // 어떤 항목에서 검색할건지 지정
          path: "제목", // 제목날짜 둘다 찾고 싶으면 ['제목', '날짜']
        },
      },
    },
    // 검색 결과가 정렬된 상태로 나옴
    { $sort: { _id: 1 } },
    // 검색 결과 최대 수를 제한해줌
    { $limit: 10 },
  ];
  // querystring의 값을 찍어보자
  console.log(요청.query.value);
  db.collection("post")
    // db에서 제목값이 요청.query.value인 게시글을 모두 찾아줌
    .aggregate(검색조건)
    .toArray((에러, 결과) => {
      console.log(결과);
      응답.render("searchCon.ejs", { posts: 결과 });
    });
});
  • 검색조건 넣어서 검색 가능
var 검색조건 = [
    {
      $search: {
        // 인덱스 이름
        index: "titleSearch",
        // 실제 검색 요청하는 부분
        text: {
          // 검색어
          query: 요청.query.value,
          // 어떤 항목에서 검색할건지 지정
          path: "제목", // 제목날짜 둘다 찾고 싶으면 ['제목', '날짜']
        },
      },
    },
    // 내가 원하는 결과만 필터링
    // 값이 1이면 가져오고, 값이 0이면 안가져옴
    // 검색 점수도 보여줄 수 있다
    { $project: { 제목: 1, _id: 1, score: { $meta: "searchScore" } } },
  ];
  • project 쓰면 검색어와 게시물의 연관성을 계산하여 점수도 알려줌
반응형