Here's an example I put together to illustrate the point.


package distance;

import java.io.IOException;
import java.util.ArrayList;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.HitCollector;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.PriorityQueue;

public class TestDistance
{

   private static QueryParser parser;
   private static IndexReader reader;
   private static Location[] locsCache;
   private static IndexSearcher searcher;
   /**
    * @param args
    */
   public static void main(String[] args) throws Exception
   {
       Analyzer analyzer=new WhitespaceAnalyzer();
       RAMDirectory dir=new RAMDirectory();
       IndexWriter writer=new IndexWriter(dir,analyzer,true);
       addDoc(writer,"the faraway mouse", 500,500);
       addDoc(writer,"the semilocal cat", 50,50);
       addDoc(writer,"the local dog", 20,20);
       writer.close();
       searcher=new IndexSearcher(dir);
       parser=new QueryParser("description", analyzer);

       //create location cache
       reader = searcher.getIndexReader();
       ArrayList allLocs=new ArrayList();
       int docCount=reader.numDocs();
       for (int i = 0; i < docCount; i++)
       {
           Document doc=reader.document(i);
           allLocs.add(new Location(
                           Float.parseFloat(doc.get("lat")),
                           Float.parseFloat(doc.get("lon"))
                           )
                       );
       }
       locsCache=new Location[reader.numDocs()];
locsCache= (Location[]) allLocs.toArray(new Location[allLocs.size()]); //example search 1
       runSearch("the cat");
runSearch("the dog"); runSearch("the mouse"); } private static void runSearch(String queryString) throws ParseException, IOException
   {
       System.out.println("query:"+queryString);
       Query query=parser.parse(queryString);
       Location queryLocation=new Location(1f,1f);
RelevanceAndDistanceCollector collector=new RelevanceAndDistanceCollector(10,
                   queryLocation,locsCache);
       searcher.search(query,collector);
       ScoreDoc[] results = collector.getMatches();
       for (int i = 0; i < results.length; i++)
       {
           Document doc=reader.document(results[i].doc);
           System.out.print("["+results[i].doc+"]");
           System.out.print("("+results[i].score+")");
           System.out.println("\t"+doc.get("description"));
       }
       System.out.println("");
   }


public static void addDoc(IndexWriter writer,String description, float lat, float lon) throws IOException
   {
       Document doc=new Document();
       doc.add(Field.UnIndexed("lat", ""+lat));
       doc.add(Field.UnIndexed("lon", ""+lon));
       doc.add(Field.Text("description",description));
writer.addDocument(doc); }
   static class Location
   {
       float lat;
       float lon;
       public Location(float lat, float lon)
       {
           this.lat=lat;
           this.lon=lon;
       }
       public float distance(Location loc)
       {
           float latDiff = Math.abs(loc.lat-lat);
           float lonDiff = Math.abs(loc.lon-lon);
float dist=(float) Math.sqrt((latDiff*latDiff)+(lonDiff*lonDiff));
           return dist;
       }
}
   static class RelevanceAndDistanceCollector extends HitCollector
   {
       HitQueue hq;
       Location queryLocation;
       float maxDistance=5000;
       private Location[] docLocs;
public RelevanceAndDistanceCollector(int numDocs, Location queryLocation, Location[] docLocs)
       {
           this.queryLocation=queryLocation;
           this.docLocs=docLocs;
           hq=new HitQueue(numDocs);
       }
       public void collect(int doc, float score)
       {
           score=score*(maxDistance-queryLocation.distance(docLocs[doc]));
hq.insert(new ScoreDoc(doc,score)); } public ScoreDoc[] getMatches()
       {
           ScoreDoc sd[]=new ScoreDoc[hq.size()];
           while(hq.size()>0)
           {
               sd[hq.size()-1]=(ScoreDoc) hq.pop();
           }
           return sd;
       }
   }
   static  class HitQueue extends PriorityQueue {
         public HitQueue(int size) {
           initialize(size);
         }
         public final boolean lessThan(Object a, Object b) {
           ScoreDoc hitA = (ScoreDoc)a;
           ScoreDoc hitB = (ScoreDoc)b;
           if (hitA.score == hitB.score)
             return hitA.doc > hitB.doc;
           else
             return hitA.score < hitB.score;
         }
}
}



                
___________________________________________________________ How much free photo storage do you get? Store your holiday snaps for FREE with Yahoo! Photos http://uk.photos.yahoo.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to