Saltar al contenido principal

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...
}

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)
: [];
}