mitmitwiki

νŒŒμ΄μ–΄λ² μ΄μŠ€λ‘œ ν‚€μ›Œλ“œ 검색 κ΅¬ν˜„ν•˜κΈ°

kohi β˜• 2023. 4. 7. 23:08
🌼 ν˜„μž¬ νŒŒμ΄μ–΄μŠ€ν† μ–΄μ—μ„œλŠ” 전체 ν…μŠ€νŠΈ 검색을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. νŒŒμ΄μ–΄λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ 검색을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” 쿼리문을 λ³€ν˜•ν•΄μ„œ μ‚¬μš©ν•˜κ±°λ‚˜ 타사 μ†”λ£¨μ…˜μΈ Algoliaλ‚˜ Elastic 같은 검색 엔진 APIλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

νŒŒμ΄μ–΄λ² μ΄μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯으둜만 ν‚€μ›Œλ“œ 검색을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ 쿼리문을 μ‚¬μš©ν•΄ 보자.

 

πŸ—’οΈ κΈ°μ‘΄ μ½”λ“œμ˜ 문제점

const q = query(collection(db, 'feed'), where('address', '>=', keyword), where('address', '<=', keyword + '\uf8ff'));
  const querySnapshot = await getDocs(q);
  setState(
    querySnapshot.docs.map((doc) => ({
      ...doc.data(),
    })),
  );

  • ν•΄λ‹Ή 쿼리문은 무쑰건 prefix κ²€μƒ‰λ§Œ κ°€λŠ₯ν•˜λ‹€.
  • addressκ°€ 전라남도 μ—¬μˆ˜μ‹œμΈ λ°μ΄ν„°μ˜ 경우 “전라남도” ν˜Ήμ€ “전라남도 μ—¬μˆ˜μ‹œ” 둜 κ²€μƒ‰ν•˜λ©΄ μ‘°νšŒκ°€ κ°€λŠ₯ν•œλ°, “μ—¬μˆ˜μ‹œ” λ‘œλŠ” 검색할 수 μ—†λ‹€.

 

πŸ—’οΈ κ·Έλž˜μ„œ μ–΄λ–»κ²Œ ν–ˆλƒ

refer

https://medium.com/@ken11zer01/firebase-firestore-text-search-and-pagination-91a0df8131ef

 

Firebase Firestore Text Search and Pagination

Implementing text search using array-contains and lazy loading.

medium.com

 

1. 검색 λŒ€μƒμ΄ λ˜λŠ” 색인 데이터λ₯Ό λ§Œλ“€μ–΄μ„œ keyword ν•„λ“œμ— λ”°λ‘œ μ €μž₯ν•œλ‹€. ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ—μ„œλŠ” 검색 λŒ€μƒμ΄ λ˜λŠ” ν•„λ“œ 값인 address, addressDetail을 띄어쓰기 λ‹¨μœ„λ‘œ μͺΌκ°œ ν•΄λ‹Ή 값을 가지고 μžˆλŠ” λͺ¨λ“  λ¬Έμ„œμ— 색인을 μΆ”κ°€ν–ˆλ‹€.

useEffect(() => {
    setKeyword(address.split(' '));
    {
      addressDetail && setKeyword((prev) => [...prev, addressDetail]);
    }
  }, [address, addressDetail]);

 

2. 검색 쿼리λ₯Ό μ‚¬μš©ν•  λ•Œ array-contains μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œλ‹€. 1λ²ˆμ—μ„œ μΆ”κ°€ν•œ keyword ν•„λ“œμ˜ 배열에 ν‚€μ›Œλ“œκ°€ ν¬ν•¨λœ 경우 값을 λͺ¨λ‘ λΆˆλŸ¬μ˜¨λ‹€.

export const searchFeedList = async (keyword: string, setState: any) => {
  const q = query(collection(db, 'feed'), where('keyword', 'array-contains', keyword));
  const querySnapshot = await getDocs(q);
  setState(
    querySnapshot.docs.map((doc) => ({
      ...doc.data(),
    })),
  );
};

 

πŸ—’οΈ ν˜„μž¬ μ½”λ“œμ˜ 문제점

  • 인덱슀λ₯Ό λ§Œλ“€ λ•Œ λ””ν…ŒμΌν•˜κ²Œ 값을 μ „λ‹¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— -postcode둜 받은 μ£Όμ†Œλ₯Ό 띄어쓰기 λ‹¨μœ„λ‘œ μͺΌκ°  κ±° + μœ μ €κ°€ μž…λ ₯ν•œ 상세 μ£Όμ†Œ λ‹¨μœ„λ‘œ μ €μž₯- μ™„μ „ν•œ 검색이 λΆˆκ°€λŠ₯ν•˜λ‹€.
    • μ—¬μˆ˜ μ•ˆ 됨 μ—¬μˆ˜μ‹œ 됨
    • 전남 μ•ˆ 됨 전라남도 됨
    • μˆ˜μ • μ „μ—λŠ” λμ—ˆλ˜ 전라남도 μ—¬μˆ˜μ‹œλ„ μ•ˆ 됨ㅋㅋㅋㅋ
  • ν‚€μ›Œλ“œλ₯Ό μ–΄λ–»κ²Œ λ””ν…ŒμΌν•˜κ²Œ λ½€κ°œμ„œ μ €μž₯ν•  것인가λ₯Ό ν•΄κ²°ν•œλ‹€λ©΄ 였히렀 검색 κΈ°λŠ₯의 완성도가 λ†’μ•„μ§ˆ 수 μžˆλŠ” μ½”λ“œκ°€ 됐기 λ•Œλ¬Έμ— μœ μ˜λ―Έν•œ 변화라고 μƒκ°ν•œλ‹€.