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': '', 'hl.tag.post': '', 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}`); });