var db = require("../db"); var bdb = require("./bdb")("search"); var STOPWORDS = require("./stopwords"); var wordRegexp = new RegExp("[^a-z0-9]+", "g"); function parse_terms(s) { return s .toLowerCase() .split(wordRegexp) .filter((term) => !!term); } function cmp(a, b) { return a < b ? -1 : a === b ? 0 : 1; } function find_term(term) { var row = bdb.get(term); if (!row) return []; var res = row.toString(); // console.log(res) if (!res.length) return []; var matches = res.split(",").map((s) => { if (!s.length) return; var partz = s.split(" "); return { thread: parseInt(partz[0]), comment: parseInt(partz[1]), file: parseInt(partz[2]), strength: parseInt(partz[3]) || 1, }; }); // console.log(matches) return matches; } function search(query, start, limit) { if (!query) return; start = parseInt(start) || 0; limit = parseInt(limit) || 10; var scores = {}; var terms = parse_terms(query); var total; var to_display = limit; var threads = {}; var thread_ids = []; var comment_ids = []; var file_ids = []; var results = []; terms.forEach((term) => { if (STOPWORDS.has(term)) return; var results = find_term(term); if (!results) return; results.forEach((result) => { var score = (scores[result.thread] = scores[result.thread] || { count: 0, strength: 0, }); score.thread = score.thread || parseInt(result.thread); score.comment = score.comment || parseInt(result.comment); score.file = score.file || parseInt(result.file); score.strength += parseFloat(result.strength); score.count += 1; }); }); total = Object.keys(scores).length; Object.values(scores) .sort((b, a) => { // if (a.count !== b.count) { // return cmp(a.count, b.count) // } return cmp(a.strength, b.strength); }) .some((match, i) => { if (i < start) return false; if (to_display-- === 0) return true; results.push(match); // console.log(match) thread_ids.push(match.thread); if (match.comment) comment_ids.push(match.comment); if (match.file) file_ids.push(match.file); return false; }); return { meta: { query: query, terms: terms, start: start, next: start + limit, limit: limit, total: total, }, results: results, thread_ids: thread_ids, comment_ids: comment_ids, file_ids: file_ids, }; } module.exports = { search: search };