Executando verificação de segurança...
4

Uma boa opção (ou não) para o Search do TabNews

Vendo que o TabNews ainda não possui um sistema de busca, lembrei de um vídeo da RocketSeat que falava sobre um tal de Sonic.

Acabei me interessando e indo um pouco mais fundo em estudar essa ferramenta de busca.

Meu projeto de teste

Usei cerca de 100 mil inserções (dados reais/públicos coletados de um e-commerce) nos meus testes.
Crei um CLI e comecei a brincar com as buscas

import readline from 'readline';
import { basename, resolve } from 'path';
import { Search } from "sonic-channel";
import Database from 'sqlite-async';
import { sonicChannelConnector, SONIC_OPTIONS } from '../constants.js';

(async () => {

    const database = await Database.open(`${basename(resolve())}/../database.sqlite`, Database.OPEN_READONLY);

    const sonicChannelSearch = new Search(SONIC_OPTIONS);

    await sonicChannelConnector(sonicChannelSearch);

    const search = async term => {

        try {
            console.time('search');

            let results = await sonicChannelSearch.query('products', 'title', term);

            console.timeEnd('search');

            let ids = results.map(result => result.substring(8, result.length));

            // Seria melhor buscar os dados em um tipo de cache (ex: Redis)
            const products = await database.all(`SELECT title FROM \`products\` WHERE \`id\` IN (${ids.join(',')}) ORDER BY \`rating_count\` DESC;`);

            console.table(products, ['title']);

            return results;
        } catch (error) {
            console.log(error);
        }

        return null;
    };

    const commands = {
        'clear': console.clear
    };

    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
        terminal: false
    });

    rl.setPrompt('stupid search > ');
    rl.prompt();

    rl.on('line', async cmd => {
        if (cmd) {
            cmd = cmd.trim();

            let cmdParts = cmd.split(' ');
            let label = cmdParts[0];

            let handle = commands[label];

            if (typeof handle === 'function') {
                try {
                    await handle();
                } catch (error) {
                    console.error(error);
                }
            } else {
                await search(cmd);

                if (cmdParts.length === 1) {
                    await suggest(cmd);
                }
            }
        }

        rl.prompt();
    }).on('close', () => {
        console.log('Bye!');
        process.exit(0);
    });
})();

CLI Query

A busca levou menos de 1ms

Nesse teste acabei usando somente o title na busca, mas ele brilha ainda mais quando o conteúdo é um texto complexo.

O Sonic mostrou ter um setup bem simples, uma integração rápida e aparentemente ser bem barato para rodar.

Já viram esse 'search backend' antes? Será que vale o teste?

Estou me colocando a disposição para ajudar na implementação caso desejem usá-lo.

Carregando publicação patrocinada...
1
2

Olá Filipe!

A ferramenta de busca será bastante útil, principalmente sobre todas as palavras das publicações, pois ajuda-nos a saber se um conteúdo a respeito de determinado já foi postado. Por exemplo, achei algo interessante para compartilhar, mas pensei ser melhor complementar alguma publicação já existente, enriquecendo-a.

https://github.com/Asabeneh/30-Days-Of-JavaScript

1
1

Nossa que solução sensacional! Isso por trás de um endpoint na API, onde cada palavra digitada pode ter seu resultado cacheado por stale-while-revalidate fica possível a pessoa ir vendo os resultados praticamente em tempo-real.

Assim que tivermos uma quantidade de conteúdos considerável no TabNews, devemos sem sombra de dúvidas alguma investir muito em busca 🤝

Obrigado por trazer esse conteúdo para cá!

0
0
1