-
[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: ${facetName}:${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 > κΈ°ν' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ