72 lines
3.1 KiB
Java
72 lines
3.1 KiB
Java
package nl.andrewlalis.gymboardsearch;
|
|
|
|
import org.apache.lucene.analysis.Analyzer;
|
|
import org.apache.lucene.analysis.standard.StandardAnalyzer;
|
|
import org.apache.lucene.document.*;
|
|
import org.apache.lucene.index.IndexWriter;
|
|
import org.apache.lucene.index.IndexWriterConfig;
|
|
import org.apache.lucene.store.Directory;
|
|
import org.apache.lucene.store.FSDirectory;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.util.FileSystemUtils;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.sql.Connection;
|
|
import java.sql.DriverManager;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
|
|
@Service
|
|
public class GymIndexGenerator {
|
|
private static final Logger log = LoggerFactory.getLogger(GymIndexGenerator.class);
|
|
|
|
void generateIndex() throws Exception {
|
|
log.info("Starting Gym index generation.");
|
|
Path gymIndexDir = Path.of("gym-index");
|
|
FileSystemUtils.deleteRecursively(gymIndexDir);
|
|
Files.createDirectory(gymIndexDir);
|
|
long count = 0;
|
|
try (
|
|
Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/gymboard-api-dev", "gymboard-api-dev", "testpass");
|
|
PreparedStatement stmt = conn.prepareStatement(DbUtils.loadClasspathString("/sql/select-gyms.sql"));
|
|
ResultSet resultSet = stmt.executeQuery();
|
|
|
|
Analyzer analyzer = new StandardAnalyzer();
|
|
Directory indexDir = FSDirectory.open(gymIndexDir);
|
|
IndexWriter indexWriter = new IndexWriter(indexDir, new IndexWriterConfig(analyzer))
|
|
) {
|
|
while (resultSet.next()) {
|
|
String shortName = resultSet.getString("short_name");
|
|
String displayName = resultSet.getString("display_name");
|
|
String cityShortName = resultSet.getString("city_short_name");
|
|
String cityName = resultSet.getString("city_name");
|
|
String countryCode = resultSet.getString("country_code");
|
|
String countryName = resultSet.getString("country_name");
|
|
String streetAddress = resultSet.getString("street_address");
|
|
BigDecimal latitude = resultSet.getBigDecimal("latitude");
|
|
BigDecimal longitude = resultSet.getBigDecimal("longitude");
|
|
|
|
Document doc = new Document();
|
|
doc.add(new StringField("short_name", shortName, Field.Store.YES));
|
|
doc.add(new StringField("display_name", displayName, Field.Store.YES));
|
|
doc.add(new StringField("city_short_name", cityShortName, Field.Store.YES));
|
|
doc.add(new StringField("city_name", cityName, Field.Store.YES));
|
|
doc.add(new StringField("country_code", countryCode, Field.Store.YES));
|
|
doc.add(new StringField("country_name", countryName, Field.Store.YES));
|
|
doc.add(new StringField("street_address", streetAddress, Field.Store.YES));
|
|
doc.add(new DoublePoint("latitude_point", latitude.doubleValue()));
|
|
doc.add(new StoredField("latitude", latitude.doubleValue()));
|
|
doc.add(new DoublePoint("longitude_point", longitude.doubleValue()));
|
|
doc.add(new StoredField("longitude", longitude.doubleValue()));
|
|
indexWriter.addDocument(doc);
|
|
count++;
|
|
}
|
|
}
|
|
log.info("Gym index generation complete. {} gyms indexed.", count);
|
|
}
|
|
}
|