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);
});
})();
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.