Thanks for a lot Siddhant Aggarwal for the quick response! On Sun, Feb 18, 2018 at 3:22 PM, Sidhant Aggarwal <sidhan...@me.com> wrote:
> Hi Aakanksha, > > You will need to use a boolean query to do this. In the boolean query > first, add a clause for the distance attribute using MUST clause and then > add another timestamp query MUST clause. > > Use this: > https://lucene.apache.org/core/6_1_0/core/org/apache/ > lucene/search/BooleanQuery.html > > On Feb 17, 2018, at 10:50 PM, Aakanksha Gupta < > aakankshagupta2...@gmail.com> wrote: > > 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? > >