import { config as setupEnv } from 'dotenv-flow'; import logger from '@/logger'; import { AlgoliaIndexKind, AlgoliaSearchIndex } from '@/services'; setupEnv({ silent: true }); const virtual = (name: string): string => `virtual(${name})`; const main = async () => { // need the primary index to be created before hand const algoliaIndex = AlgoliaSearchIndex.fromIndex(AlgoliaIndexKind.PRODUCTS); // create replicas and add main ranking await algoliaIndex.setSettings({ replicas: [ virtual(AlgoliaIndexKind.PRODUCTS_NAME_ASC), virtual(AlgoliaIndexKind.PRODUCTS_PRICE_ASC), virtual(AlgoliaIndexKind.PRODUCTS_PRICE_DESC), virtual(AlgoliaIndexKind.PRODUCTS_SAVING_DESC), ], ranking: [ 'desc(isAvailable)', 'desc(lastModified)', 'typo', 'geo', 'words', 'filters', 'proximity', 'attribute', 'exact', 'custom', ], }); // update sort settings // Name asc index const nameAscIndex = AlgoliaSearchIndex.fromIndex( AlgoliaIndexKind.PRODUCTS_NAME_ASC ); await nameAscIndex.setSettings({ customRanking: ['asc(name)'], }); // Price asc index const priceAscIndex = AlgoliaSearchIndex.fromIndex( AlgoliaIndexKind.PRODUCTS_PRICE_ASC ); await priceAscIndex.setSettings({ customRanking: ['asc(lowestPrice)'], }); // Price desc index const priceDescIndex = AlgoliaSearchIndex.fromIndex( AlgoliaIndexKind.PRODUCTS_PRICE_DESC ); await priceDescIndex.setSettings({ customRanking: ['desc(lowestPrice)'], }); // Saving desc index const savingDescIndex = AlgoliaSearchIndex.fromIndex( AlgoliaIndexKind.PRODUCTS_SAVING_DESC ); await savingDescIndex.setSettings({ customRanking: ['desc(savingRatio)'], }); }; if (require.main === module) { console.time('create-algolia-product-replicas'); main() .then(() => { console.timeEnd('create-algolia-product-replicas'); }) .catch((error) => { logger.error(error); process.exit(1); }); }