RSS Git Download  Clone
Raw Blame History 1kB 41 lines
const consolePrefix = 'socket.io vectorset sim'

export default async (options) => {
    const {socket, payload} = options;

    try {
        const redis = socket.p3xrs.ioredis
        const { key, mode, element, values, count, filter } = payload
        const n = parseInt(count) || 10

        let raw
        if (mode === 'element') {
            const args = ['VSIM', key, 'ELE', element, 'COUNT', n, 'WITHSCORES']
            if (filter) args.push('FILTER', filter)
            raw = await redis.call(...args)
        } else {
            // mode === 'vector'
            const dim = values.length
            const args = ['VSIM', key, 'VALUES', dim, ...values.map(Number), 'COUNT', n, 'WITHSCORES']
            if (filter) args.push('FILTER', filter)
            raw = await redis.call(...args)
        }

        const results = []
        for (let i = 0; i < raw.length; i += 2) {
            results.push({ element: raw[i], score: parseFloat(raw[i + 1]) || 0 })
        }

        socket.emit(options.responseEvent, {
            status: 'ok',
            results: results,
        })
    } catch (e) {
        console.error(e)
        socket.emit(options.responseEvent, {
            status: 'error',
            error: e.message,
        })
    }
}