82 lines
2.7 KiB
JavaScript
82 lines
2.7 KiB
JavaScript
const express = require('express');
|
|
const axios = require('axios');
|
|
const app = express();
|
|
const path = require('path');
|
|
|
|
// Set EJS as the view engine
|
|
app.set('view engine', 'ejs');
|
|
|
|
// Specify the views directory
|
|
app.set('views', path.join(__dirname, 'views'));
|
|
|
|
// Middleware to parse JSON request body
|
|
app.use(express.json());
|
|
|
|
// Serve static files (CSS, JavaScript, images, etc.)
|
|
app.use(express.static('public'));
|
|
|
|
// Search endpoint
|
|
app.get('/search', async (req, res) => {
|
|
try {
|
|
// Extract search query from request query parameters
|
|
const { query, page = 1, pageSize = 10 } = req.query;
|
|
|
|
// Validate search query
|
|
if (!query) {
|
|
return res.status(400).json({ error: 'Query parameter is required' });
|
|
}
|
|
|
|
// Calculate start offset for pagination
|
|
const start = (page - 1) * pageSize;
|
|
|
|
// Sanitize search query to prevent code injection
|
|
const sanitizedQuery = sanitizeQuery(query);
|
|
|
|
// Send search query to Solr
|
|
const response = await axios.get(solrUrl + '/select', {
|
|
params: {
|
|
q: `text:${sanitizedQuery}`, // Query string with field name
|
|
hl: 'true',
|
|
'hl.method': 'unified',
|
|
'hl.fl': '*',
|
|
'hl.snippets': 5,
|
|
'hl.tag.pre': '<b class=\"result-highlight\">',
|
|
'hl.tag.post': '</b>',
|
|
start, // Start offset for pagination
|
|
rows: 10, // Number of rows to return
|
|
wt: 'json', // Response format (JSON)
|
|
},
|
|
});
|
|
|
|
// Extract search results from Solr response
|
|
const searchResults = response.data.response.docs;
|
|
const highlightedSnippets = response.data.highlighting;
|
|
|
|
// Calculate total number of results (needed for pagination)
|
|
const totalResults = response.data.response.numFound;
|
|
|
|
// Calculate total number of pages
|
|
const totalPages = Math.ceil(totalResults / pageSize);
|
|
|
|
// Send search results as JSON response
|
|
//res.json({ searchResults, highlightedSnippets });
|
|
res.render('search-results', { query, searchResults, highlightedSnippets, page, pageSize, totalResults, totalPages });
|
|
} catch (error) {
|
|
console.error('Error searching Solr:', error.message);
|
|
res.status(500).json({ error: 'Internal server error' });
|
|
}
|
|
});
|
|
|
|
// Function to sanitize search query to prevent code injection
|
|
function sanitizeQuery(query) {
|
|
// Remove any characters that are not alphanumeric or whitespace
|
|
return query.replace(/[^\w\s"]/gi, '');
|
|
}
|
|
|
|
// Start server
|
|
const solrUrl = 'http://solr.services.cleveland.daball.me:8983/solr/my_core'; // URL of your Solr instance
|
|
const PORT = process.env.PORT || 3000;
|
|
app.listen(PORT, () => {
|
|
console.log(`Server is running on port ${PORT}`);
|
|
});
|