-
Notifications
You must be signed in to change notification settings - Fork 15
/
index.js
131 lines (119 loc) · 2.79 KB
/
index.js
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
const express = require('express');
const elasticsearch = require('elasticsearch');
const router = express.Router();
/**
* Helper to check if an object's property does not exist or is empty.
*
* @see https://stackoverflow.com/a/28552610/1120652
*
* @param {Object} object
* The object whose property will be checked.
* @param {string} property
* The property within the object to check.
* @returns {boolean}
* TRUE if the property does not exist or is empty.
*/
const isEmpty = function isEmpty(object, property) {
return ((object[property] === undefined) ||
(object[property].length === 0) ||
(object[property] === 'undefined'));
};
/**
* Performs a query against Elasticsearch and renders
* the response.
*
* @param {Object} req
* The request object.
* @param {Object} res
* The response object.
*/
const doSearch = function doSearch(req, res) {
// Initialize the Elasticsearch client.
const client = new elasticsearch.Client({
host: 'http://elastic:changeme@elasticsearch:9200',
log: 'trace',
});
let searchString = '';
let searchType = '';
// Prepare the request body.
const body = {
size: 100,
};
if (!isEmpty(req.query, 'search') || !isEmpty(req.query, 'type')) {
const query = {
bool: {},
};
if (!isEmpty(req.query, 'search')) {
query.bool.must = {
multi_match: {
fields: [
'title^2',
'summary',
],
query: req.query.search,
fuzziness: 'auto',
},
};
searchString = req.query.search;
}
if (!isEmpty(req.query, 'type')) {
query.bool.filter = [
{
term: {
type: req.query.type,
},
},
];
searchType = req.query.type;
}
body.query = query;
}
// Add a type facet.
body.aggs = {
type: {
terms: {
field: 'type',
},
},
};
// Perform the search request.
client.search({
index: 'elasticsearch_index_demo_elastic',
body,
}).then((resp) => {
// Render results in a template.
res.render('index', {
hits: resp.hits.hits,
total: resp.hits.total,
aggregations: resp.aggregations.type.buckets,
searchString,
searchType,
});
}, (err) => {
console.trace(err.message);
});
};
/**
* The initial request that loads the form and all the documents in
* Elasticsearch.
*
* @param {Object} req
* The request object.
* @param {Object} res
* The response object.
*/
router.get('/', (req, res) => {
doSearch(req, res);
});
/**
* Processes form submissions by modifying the query for Elasticsearch.
*
* @param {Object} req
* The request object.
* @param {Object} res
* The response object.
*/
router.post('/', (req, res) => {
doSearch(req, res);
});
module.exports = router;