I have an assignment to find cab drivers close to a given user's location(similar to Grab/Lyft). I have the drivers' location(latitude, longitude) with timestamp. This data is pushed by their mobile to my server every 2 minutes. When a user requests a ride, I need to find the nearest driver available using the drivers' data. I'm trying to use Lucene's GeoSpatial search for this. I've used the drivers data to be indexed and search based on the latitude and longitude of the user. I'm also able to search with a given latitude/longitude combination and get the nearest driver(s) with a distance parameter. But I don't know how I can add another parameter to the search query to specify the timestamp of the driver's data as well. For e.g., I want to search for only drivers who are near a given location at a particular timestamp. Can someone help me with this? Here's the code snippet I'm using:
package com.test.trials; import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.StoredField;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TopDocs;import org.apache.lucene.spatial3d.Geo3DPoint;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.document.LatLonPoint; public class LuceneTrial { private IndexSearcher searcher; public static void main(String[] args) throws IOException { LuceneTrial trial = new LuceneTrial(); trial.generateData(); trial.search(); } private void generateData() throws IOException { Directory dir = FSDirectory.open(Paths.get("C:/temp/Lucene")); Analyzer analyzer = new StandardAnalyzer(); IndexWriterConfig iwc = new IndexWriterConfig(analyzer); iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE); IndexWriter writer = new IndexWriter(dir, iwc); try (BufferedReader br = new BufferedReader(new FileReader( "C:/temp/Lucene/Drivers.csv"))) { String line; String[] fieldNames = new String[] { "Driver ID", "Latitude", "Longitude", "Time" }; while ((line = br.readLine()) != null) { // process the line. String[] tags = line.split(","); Document doc = new Document(); for (int i = 0; i < fieldNames.length; i++) doc.add(new StoredField(fieldNames[i], tags[i])); // Add a latlon point to index try { doc.add(new LatLonPoint("latlon", Double .parseDouble(tags[1]), Double.parseDouble(tags[2]))); Geo3DPoint point = new Geo3DPoint("geo3d", Double.parseDouble(tags[1]), Double.parseDouble(tags[2])); doc.add(point); } catch (Exception e) { System.out.println("Skipped: " + line); } writer.addDocument(doc); } } searcher = new IndexSearcher(DirectoryReader.open(writer)); } public void search() throws IOException { System.out .println("\nLatLonQuery around given point, 10km radius --------------------------------------"); TopDocs docs = searcher.search(LatLonPoint.newDistanceQuery("latlon", 6.9270790, 79.8612430, 10 * 1000), 20); for (ScoreDoc scoreDoc : docs.scoreDocs) { Document doc = searcher.doc(scoreDoc.doc); System.out.println(doc); } } } And here's the sample data I'm using: Driver ID Latitude Longitude Time1 -6.081689 145.391881 7:01:172 -5.207083 145.7887 8:32:403 -5.826789 144.295861 8:40:494 -6.569828 146.726242 8:57:335 -9.443383 147.22005 6:14:266 -3.583828 143.669186 8:13:357 61.160517 -45.425978 8:58:248 64.190922 -51.678064 7:42:169 67.016969 -50.689325 6:52:2010 76.531203 -68.703161 6:08:2111 65.659994 -18.072703 7:57:4512 65.283333 -14.401389 7:32:2313 64.295556 -15.227222 8:20:2614 65.952328 -17.425978 8:51:3415 66.058056 -23.135278 8:33:4316 63.985 -22.605556 7:39:3517 65.555833 -23.965 7:20:5418 64.13 -21.940556 7:37:4819 66.133333 -18.916667 6:46:3620 63.424303 -20.278875 7:15:1221 46.485001 -84.509445 6:14:1522 50.056389 -97.0325 7:12:1523 44.639721 -63.499444 6:15:3124 51.391944 -56.083056 7:15:5025 49.082222 -125.7725 6:52:22 Can someone show me how I can search for the drivers based on two attributes - distance and time?