Servicios de Typesense
El proyecto utiliza el servicio TypesenseService definido en src/services/typesense-service.ts para interactuar con Typesense.
Importaciones
import typesense from "typesense"
import {NodeConfiguration} from "typesense/lib/Typesense/Configuration";
import {SearchOptions, SearchParams} from "typesense/src/Typesense/Documents";
import { categoryFields } from "../../src/utils/typesense";
Configuración
const TIMEOUT_PERIOD = 30
const TypesenseService = (() => {
let TYPESENSE_INDEX_NAME = process.env.NEXT_PUBLIC_TYPESENSE_INDEX_NAME;
let TYPESENSE_HOST = process.env.NEXT_PUBLIC_TYPESENSE_HOST;
let TYPESENSE_API_KEY = process.env.NEXT_PUBLIC_TYPESENSE_READONLY_API_KEY;
let NODES: NodeConfiguration[] = [
{ host: TYPESENSE_HOST, port: 443, protocol: 'https' },
];
let searchClient = new typesense.SearchClient({
nodes: NODES,
apiKey: TYPESENSE_API_KEY,
})
let client = new typesense.Client({
nodes: NODES,
apiKey: TYPESENSE_API_KEY,
})
// Métodos del servicio...
})();
Métodos disponibles
init
Inicializa el cliente de Typesense con nuevos valores.
init: ({host, indexName, apiKey}: { host: string, indexName: string, apiKey: string }) => {
// Inicialización del cliente...
}
search
Realiza una búsqueda en Typesense.
search: async (searchParams: SearchParams, requestOptions: SearchOptions = {}, indexName = TYPESENSE_INDEX_NAME) => {
const index = searchClient.collections(indexName).documents()
return await index.search(searchParams, requestOptions)
}
searchBySkus
Busca productos por sus SKUs.
searchBySkus: async ({sortBy = '', onlyVisible = false, skus = [], indexName = TYPESENSE_INDEX_NAME, attributesToRetrieve = undefined, facetFilters = []}) => {
// Implementación...
}
searchBySku
Busca un producto por su SKU.
searchBySku: async ({sku, indexName = TYPESENSE_INDEX_NAME, attributesToRetrieve = undefined}) => {
// Implementación...
}
getBestSellers
Obtiene los productos más vendidos.
getBestSellers: async (requestOptions = {}, indexName = TYPESENSE_INDEX_NAME) => {
// Implementación...
}
searchByVariantCode
Busca productos por código de variante.
searchByVariantCode: async ({sku, variantCode = null, indexName = TYPESENSE_INDEX_NAME, attributesToRetrieve = undefined, facetFilters = []}) => {
// Implementación...
}
getRecommenders
Obtiene recomendaciones de productos.
getRecommenders: async ({filter_by, query_by, limit, indexName = TYPESENSE_INDEX_NAME, attributesToRetrieve = categoryFields, sort_by = '_text_match(buckets: 5):desc, weighted_score:desc'}) => {
// Implementación...
}
getHits
Procesa los resultados de la búsqueda para obtener los resultados.
getHits: (results) => {
return (results?.hits ?? []).length > 0
? results.hits.map(hit => hit.document)
: [];
}