1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
var db = require('../db')
var bdb = require('./bdb')
var STOPWORDS = require('./stopwords')
var wordRegexp = new RegExp("(\W+)");
var wordBoundaryRegexp = new RegExp("\W");
function parse_terms (s) {
return s.toLowerCase().split(wordRegexp).filter((term) => {
if (! term.match(wordBoundaryRegexp)) {
return true
}
return false
})
}
function cmp (a,b){ return (a<b)?a:(a===b)?0:1 }
function find_term(term) {
var res = bdb.get(term).toString()
console.log(res)
if (! res.length) return []
var matches = res.split(",").map((s) => {
if (! s.length) return;
console.log(s)
var partz = s.split(" ")
return {
thread: s[0],
comment: s[1],
file: s[2],
strength: s[3],
}
})
return matches
}
function search (query, start, limit) {
if (!query) return
start = start || 0;
limit = limit || 10;
var scores = {};
var terms = parse_terms(query);
var i = 0
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 || result.thread
score.comment = score.comment || result.comment
score.file = score.file || result.file
score.strength += result.strength
score.count += 1
})
})
total = Object.keys(scores).length
Object.values(scores).sort((a,b) => {
if (b.count !== a.count) {
return cmp(b.count, a.count)
}
return cmp(b.strength * b.count, a.strength * a.count)
}).some((match) => {
if (i++ < start) return false
if (to_display-- === 0) return true
results.push(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 {
query: query,
start: start,
next: start + limit,
limit: limit,
total: total,
results: results,
thread_ids: thread_ids,
comment_ids: comment_ids,
file_ids: file_ids,
terms: terms,
};
}
module.exports = { search: search }
|