-
[Algolia, Firebase, React Native] Algolia ๋ฅผ ์ด์ฉํด์ ๊ฒ์ํ๊ธฐPROGRAMMING/๊ธฐํ 2022. 1. 25. 19:51
์ด๋ฒ ํฌ์คํ ์์๋ Node.js ๊ธฐ๋ฐ์ผ๋ก Algolia ๋ฅผ ์ด์ฉํด์ ๊ฒ์ํ๋ ๊ฒ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
- npm 6.4.11
- algoliasearch 4.12.0
- React Native
Algolia ์ Firebase ๋ฅผ ์ฐ๊ฒฐํ๊ณ index ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ด์ ํฌ์คํ ๋ค์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
[Firebase] Cloud Extension ์ผ๋ก Algolia ์ฐ๊ฒฐํด์ ๊ฒ์ ๊ตฌํ
Firebase ๋ text ๊ฒ์์ด exact search ๊ฒ์๋ง ๊ฐ๋ฅํฉ๋๋ค. https://firebase.google.com/docs/firestore/solutions/search ๋ฐ๋ผ์ ๊ฒ์ ์ ์ฒด์ธ Algolia ๋ฅผ ์ฐ๋ํ์ฌ ์ฌ์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ ๋งํฌ์์๋ ๋ค๋ฅธ..
iforint.tistory.com
์ด๋ ๊ฒ ์ ์ฐ๊ฒฐ๋ง ํด๋๋ค๋ฉด, ๊ฒ์์ ์ ๋ง์ด์ง ์์ฃผ ๊ฐ๋จํฉ๋๋ค.
(๋๋์ด ๊ธด ์ฌ์ ์ ๋๋ผ ๋๊ฐ..)1. algoliasearch ์ค์น
$ npm install algoliasearch
npm ์ผ๋ก algoliasearch ๋ฅผ ์ค์นํด์ค๋๋ค. (https://www.npmjs.com/package/algoliasearch)
2. Algolia ์ค์ : client, index
๋ค์๊ณผ ๊ฐ์ด algolia search client ๋ฅผ APP ID ์ API Key ๋ฅผ ๊ฐ์ง๊ณ ๋ง๋ค์ด์ฃผ๊ณ , ๊ฒ์ํ index ๋ฅผ ๋ฑ๋กํด์ค๋๋ค.
์ ์ ๊ฒฝ์ฐ APP ID ์ Search-Only API Key ๋ฅผ Front-end ์์ ์ฌ์ฉํ๋๋ก ํ ๊ฒ์ด์ง๋ง, ๊ทธ๋๋ ์ด ์ ๋ณด๋ค์ ์ฑ์ ๋๋ ๊ฒ์ ์ข์ง ์์ ๊ฒ์ผ๋ก ํ๋จํ์ฌ Firebase Firestore ์ ๋ฃ์ด๋๊ณ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ ์์ผ๋ก ๊ตฌํํ์ต๋๋ค. (์๋ firestore ์ฌ์ฉํด์ firestore ์ ๋ฃ์ด๋ ๊ฒ์ ๋๋ค.)
import firestore from '@react-native-firebase/firestore'; const algoliasearch = require("algoliasearch"); var collectionIndex; async function initAlgolia() { // Get algolia keys first const doc = await firestore().collection('Algolia').doc('algolia').get(); const algolia = doc.data(); // make algolia client and target index searchClient = algoliasearch(algolia.AppId, algolia.APIKey); const indexName = 'dev_title'; collectionIndex = searchClient.initIndex(indexName); };
3. Search ๊ธฐ๋ฅ ๊ตฌํ
search ๋ ์ ๋ง ํ์ํ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ collectionIndex.search() ์ด๊ณ , ์ด ํจ์๋ query ์ options ์ ์ธ์๋ก ๋ฐ๋ ํจ์์ ๋๋ค.
(https://www.algolia.com/doc/api-reference/api-methods/search/)
๊ทธ๋ฅ ๊ฒ์์ ํ๋ฉด ๋ฑ๋ก๋์ด ์๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋์์ผ๋ก ๊ฒ์์ ์งํํฉ๋๋ค.
์ ์ ๊ฒฝ์ฐ, ๋ค์์ 2๊ฐ์ง๊ฐ ๊ฐ๋ฅํ ๊ฒ์์ ๊ตฌํํ๋ ค ํ์ต๋๋ค.
- title ์์๋ง ๊ฒ์
- uid ์ ๋ณด๊ฐ USER_ID ์ธ ๊ฒ๋ค๋ง ๊ฒ์
์ฆ, ํน์ ์ฌ์ฉ์์ title ์ด๋ผ๋ ์์ ์ค์์ ๊ฒ์์ ํ๋ ค๊ณ ํ์ต๋๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด search ์์ ์ง์ํ๋ Search API Parameters ์ค, restrictSearchableAttributes ์ filters ๋ฅผ ์ฌ์ฉํด์ ํด๋น ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
(Algolia Search API Parameters: https://www.algolia.com/doc/api-reference/search-api-parameters/)
const userFilter = `uid:${USER_ID}` /** * Search by title * @param {string} query * @returns {Promise} */ async function searchTiccleWithAlgolia(query) { // search with Algolia const result = await collectionIndex.search(query, { restrictSearchableAttributes: [ "title", // ONLY look at title ], filters: userFilter, }); var metadataList = []; result.hits.forEach(element => { const record = { id: element.objectID, title: element.title, } metadataList.push(record); }); // return search result return new Promise(resolve => { resolve(metadataList); }); }
3-1) restrictSearchableAttributes
restrictSearchableAttributes ๋ฅผ parameter ๋ก ์ฃผ๋ฉด, ํด๋น field ๋ค์์๋ง ๊ฒ์์ ํ๊ฒ ๋ฉ๋๋ค.
๋จ, ๊ทธ๋ฌ๊ธฐ ์ํด์๋ Algolia ์์ Searchable attributes ์ ํด๋น ํ๋๋ค์ ๋ฑ๋กํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ ๋ dashboard ์์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํด์ฃผ์์ต๋๋ค. (index -> Configuration -> Searchable attributes)
3-2) filters
filters ๋ SQL ๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ๊ฑธ๋ฌ๋ด๋ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
์ ์ ๊ฒฝ์ฐ, ํน์ uid ์ ๋ํ ๊ฒ๋ค๋ง ๊ฒฐ๊ณผ๋ก ๋ฐ๊ธฐ ์ํด์ filters ๋ฅผ ์ฌ์ฉํ๋ ค ํ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ณต์ ๋ฌธ์์ ์ค๋ช ์ ๋ณด๋ฉด, ํํฐ๋ฅผ ํ๋ ค๋ field ์ ์ด๋ฆ์ string value ๊ฐ ํฌํจ๋๋ค๋ฉด attributesForFaceting ์ ์ค์ ํด์ผ ํ๋ค๊ณ ๋์์์ต๋๋ค.
Format: {facetValue}
When ${facetName} contains string values, you need to declare it in attributesForFaceting๊ทธ๋์ index ์ Configuration ์ Attributes for faceting ์์ ๋ค์๊ณผ ๊ฐ์ด uid ํ๋๋ฅผ ๋ฑ๋กํด์ฃผ์์ต๋๋ค.
(์ด๋ index.setSettings() ๋ก ํด์ฃผ์ด๋ ๋์ง๋ง, ์ ์ ๊ฒฝ์ฐ Search-Only API Key ๋ฅผ ์ฌ์ฉํ์ฌ setting ์ ํ ์ ์์๊ธฐ๋ ํ๊ณ , ํ๋ฒ๋ง ์ค์ ํ๋ฉด ๋๋ dashboard ๋ฅผ ํตํด ํด์ฃผ์์ต๋๋ค.)
(index -> Configuration -> Facets -> Attributes for faceting)
์ด๋ ๊ฒ ์ค์ ๊น์ง ๋ค ํด์ฃผ๋ฉด ์์ ์ฝ๋๋ก ์ฑ๊ณต์ ์ผ๋ก ๊ฒ์ํ ์ ์์ต๋๋ค!
Algolia ๋ Firebase ์์ full text ๊ฒ์์ด ์๋ผ์ ๋์์ฑ ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ๋ฐ, ์ฒ์์๋ ๋ฒ๊ฑฐ๋กญ๋ค๊ณ ์๊ฐ์ด ๋ค์์ผ๋ ๋์๋ณด๋ ์ ๊ฒ์ ์ ์ฒด๋ฅผ ๋ฐ๋ก ์ฐ๊ฒฐํด์ ์ฐ๋์ง ์ ์ ์์์ต๋๋ค. ํนํ, ๊ฐ์ ๊ฒ์ query ๋ฉด cache ๋ฅผ ๋๋์ง (์ ํํ ์ฐพ์๋ณด์ง๋ ์์์ต๋๋ค) ๊ฒฐ๊ณผ๊ฐ ๋ ๋นจ๋ฆฌ ์ค๋๋ผ๊ณ ์. ์ฐ๊ฒฐํ๋ ์์ ๋ ์ฒ์์ ์ ํด๋๋ฉด ๋ค๋ก๋ ํน๋ณํ ์๋ณผ ๊ฒ์ด ์๊ธฐ๋ ํ์ต๋๋ค.
์๋ฌดํผ ์ด๋ ๊ฒ Firebase ๋ฅผ Algolia ์ ์ฐ๊ฒฐํ๊ณ , ๊ฒ์์ ๊ตฌํํ์ฌ ์ ์๋ํ๋ ๊ฒ๊น์ง ํ์ธํด๋ณด์์ต๋๋ค!
'PROGRAMMING > ๊ธฐํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ