ํ”„๋กœ์ ํŠธ

Firebase ๋ถ€๋ถ„ ๋ฌธ์ž ๊ฒ€์ƒ‰๊ธฐ๋Šฅ ๊ตฌํ˜„

Yuuuki 2024. 7. 11. 11:05

โ—๏ธfirebase store์—์„œ๋Š” ๋ถ€๋ถ„ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

ex) ๊ท€์—ฌ์šด ํ˜ธ๋‘๋ผ๋Š” ์œ ์ €๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ํ˜ธ๋‘๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ ‘๋‘์–ด๊ฐ€ ์ผ์น˜ํ•˜๋„๋ก ์ž…๋ ฅํ•ด์•ผ ์ฐพ๊ณ ์žํ•˜๋Š” ์œ ์ €๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค

 

์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด๋ผ๋ฉด, ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์— ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋Š”๊ฒƒ ๊ฐ™์•„ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋กœ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด๊ฒฐํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

 

export const cleaningText = (text: string): string => {
  // ํŠน์ˆ˜๋ฌธ์ž ๋ฐ ๊ณต๋ฐฑ ์ œ๊ฑฐ, ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›
  const regEx = /[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/ ]/gim;

  const cleanText = text.replace(regEx, "").toLowerCase();

  return cleanText;
};
 const q = query(
  userRef,
  where("cleanedNickname", ">=", cleanedNickname),
  where("cleanedNickname", "<=", cleanedNickname + "\uf8ff")
);

 

์ฒ˜์Œ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹์€, ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„๊ณผ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•œ cleanedNickname ์„ ์ ์šฉํ•˜๊ณ , ์ด์ฒ˜๋Ÿผ ์ฟผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿ‘‰๐Ÿป ์ด ๋ฐฉ์‹์€ ํ•ด๋‹น searchTerm์œผ๋กœ ๋๋‚˜๋Š” ๋ฌธ์ž์—ด์€ ๊ฒ€์ƒ‰์ด ๋ถˆ๊ฐ€๋Šฅํ•จ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ์กฐํ•ฉ ์ƒ์„ฑ

import { cleaningText } from "./cleaningText";

export const createKeyWords = (texts: string[]) => {
  const keywords = new Set<string>();

  texts.forEach((text) => {
    const cleanText = cleaningText(text);
    const length = cleanText.length;

    // ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ 2๊ธ€์ž ์ด์ƒ, 10๊ธ€์ž ์ดํ•˜์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑ
    for (let i = 0; i < length; i++) {
      let temp = "";
      for (let j = i; j < length && j < i + 10; j++) {
        temp += cleanText[j];
        if (temp.length >= 2) {
          keywords.add(temp);
        }
      }
    }

    return Array.from(keywords);
  });
};

์ •๊ทœ์‹์œผ๋กœ ํ•œ๋ฒˆ text๋ฅผ (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„x, ๊ณต๋ฐฑ์ œ๊ฑฐ)๊ฑธ๋Ÿฌ์„œ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์ด ํ…์ŠคํŠธ๋กœ ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

๐Ÿ‘‰๐Ÿป ๋ฏธ๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ‚ค์›Œ๋“œ์˜ ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด Array์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ

 

array-contains-any
 

firebase์˜ ์ฟผ๋ฆฌ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋กœ, ํŠน์ •ํ•„๋“œ์— ์ง€์ •๋œ ๋ฐฐ์—ด์ค‘ ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ด์ค€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, ๋‹ค์ค‘๊ฐ’์„ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์„ ๋Œ€์ƒ์œผ๋กœ ์œ ์—ฐํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜์žˆ๋‹ค.

const q = query(postRef, where("keywords", "array-contains-any", keywords));

 

๐Ÿ‘‰๐Ÿป ๋งŒ๋“ค์–ด๋†“์€ ์—ฌ๋Ÿฌ์กฐํ•ฉ์˜ keywords๋ฅผ ์ฟผ๋ฆฌํ•จ

 

 

์ด์ œ ์ฐพ๊ณ ์žํ•˜๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ํฌํ•จํ•œ๋‹ค๋ฉด ๊ฒ€์ƒ‰๊ฒฐ๊ณผ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค.

 

๐Ÿค” ์ƒ๊ฐ์น˜๋„ ๋ชปํ•˜๊ฒŒ, firebase๊ฐ€ ๋ถ€๋ถ„๋ฌธ์ž ๊ฒ€์ƒ‰์„ ์ง€์›ํ•ด์ฃผ์ง€ ์•Š์•„ ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ์ด๋Ÿฐ์‹์œผ๋กœ ํ‚ค์›Œ๋“œ๋“ค์„ ์œ ์ €์™€ ๊ฒŒ์‹œ๋ฌผ๋งˆ๋‹ค ์ƒ์„ฑํ•˜๊ณ  DB์— ์ €์žฅ์„ ํ•˜๋Š”๊ฒƒ์ด ํŠนํžˆ๋‚˜, ์„œ๋น„์Šค์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง„๋‹ค๋ฉด ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด ๋ ๊ฒƒ์ด๋‹ค. ์™ธ๋ถ€ ๋‹ค๋ฅธ Algolia๋‚˜ Elastic ๊ฐ™์€ ๊ฒ€์ƒ‰ ์—”์ง„ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ๋‹ค๊ณ  ํ•˜๋‹ˆ, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋„ ๊ณ ๋ คํ•ด๋ณด์•„์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.