summaryrefslogtreecommitdiff
path: root/app/benchmark/match-str.js
blob: 225cbc204efd021a8b0ba372450a85663746fc05 (plain)
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
var microtime = require('microtime');

const match = require('../utils/match-util.js');
const memory_usage = require('../utils/mem-usage.js');
const kb = require('../utils/kb-util.js');

// const products = require('../../data/products.json');
var products;
try {
    products = require('../../data/products.json');
} catch (e) {
    products = [];
}

// memory_usage.report();

// test runner
function run(query) {

    var f0 = microtime.nowDouble();
    let result;
    // for(let i = 0 ; i < 20 ; i++)
        result = matchQuery(query);
    var f1 = microtime.nowDouble();

    memory_usage.report();

    return {
        t: f1-f0,
        q: query,
        result: result
    }
}

// sample search implementation
function matchQuery(query) {
    var result = [];

    let q = kb.keyboardize(query);

    for(let i = 0; i < products.length; i++) {

        let rate = 0;
        let found = false;
        let x;
        let src = products[i].kb.split(' ');     // (array) source of product (key-)words
        if ((x = match.weighted_exact(q, src)) > 0) {
            // console.log(products[i].kb, x);
            rate = 5.0 + x;
            found = true;
        }
        else if ((x = match.weighted_partial(q, src)) > 0) {
            rate = 3.0 + x;
            found = true;
        }
        else {
            let similarity = 0;
            src.forEach( w => {
                let sim = match.resemblance(q, w, 2);
                if (sim > 0.6) {
                    found = true;
                    similarity = (sim > similarity) ? sim : similarity;
                }    
            });
            if (found) {
                rate = 2 * similarity;
            }
        }

        if (found) {
            products[i].rate = rate;
            result.push(products[i]);
        }
    }

    return result.sort((a,b) => b.rate - a.rate).slice(0, 48);;
}


module.exports = { run }