Sequelize Op.or / Op.like

백승문·2021년 10월 29일
0

사이드 프로젝트로 개인 테크블로그를 만들던 중, 키워드 검색기능을 추가하려고 로직을 생각하던 중
sequelize 의 query operator를 이용하는것은 알고있었으나, 한번도 사용해본적이 없어서 계속 오류가났었다.
테크블로그에 포스팅할때 제목과 내용, 키워드를 작성할 수 있는데 여기서 내용과 키워드에 들어가있는 단어나 문장을 검색기능을 활용하여 검색을 하려면 어떻게해야할까 ?

처음에 시도했던 코드는

const findByKeyword = await Post.findAll({
      getAllPostsByKeyword: async (req, res) => {
    const keyword = req.params.keyword;
    const findByKeyword = await Post.findAll({
      attributes: ['id', 'content', 'title', 'keyword', 'thumbnail'],
      where: {
        [Op.or]: [
          {
            content: {
              keyword
            },
          },
          {
            keyword: {
              keyword
            },
          },
        ],
      },

이런식으로 시도하였으나, or 연산자만 이용하면 키워드나 본문내용에 들어가있는 키워드를 포함시키는게아니라
키워드와 본문내용을 정확하게 적어야만 검색기능이 작동되었다. 예를들어 포스팅할때 #리액트 라는 키워드를 포함시켜서 포스팅을했는데, #리액 이런식으론 검색이안되고 #리액트 라고 정확하게 입력해야했다. 이러면 검색기능을 추가하는게 의미가없을거같아 조금 더 찾아보는중 like 를 알게됐다.

getAllPostsByKeyword: async (req, res) => {
    const keyword = req.params.keyword;
    const findByKeyword = await Post.findAll({
      attributes: ['id', 'content', 'title', 'keyword', 'thumbnail'],
      where: {
        [Op.or]: [
          {
            content: {
              [Op.like]: `%${keyword}%`,
            },
          },
          {
            keyword: {
              [Op.like]: `%${keyword}%`,
            },
          },
        ],
      },

Op.like를 이용해서 코드를 작성했고, 결과적으로 #리액 혹은 #리 만 검색해도 #리액트 키워드를 찾아낼 수 있었다.

profile
코딩을 잘하고싶은 코린이입니다

0개의 댓글