使用lucene做拉框查询 最简单不过了 直接看代码:
private List<Document> spatialQuery0(String keyword,double minx,double miny,double maxx,double maxy){ List<Document> lst=new ArrayList<Document>(); try{ File f=new File(heath_index_path); if(!f.exists()){ f.mkdirs(); } Directory d=FSDirectory.open(f); Analyzer a=new IKAnalyzer(); IndexSearcher searcher=new IndexSearcher(d, true); BooleanQuery query=new BooleanQuery(); // xx 关键字 Query word=new QueryParser(Version.LUCENE_30, "comp_name", a).parse(keyword); //x 经度 // NumericRangeQuery t1=ne//new NumericRangeQuery("x", "80.0", "120.0", true, true); NumericRangeQuery<Double> lon=NumericRangeQuery.newDoubleRange("x", 8, minx, maxx, true, true);//new NumericRangeQuery<Double>("y",8,32,new Double(80.0),new Double(120.0),true,true); // NumericRangeQuery<Number> //y 维度 NumericRangeQuery<Double> lat=NumericRangeQuery.newDoubleRange("y", 8, miny, maxy, true, true);//new TermRangeQuery("y", "10.0", "40.0", true, true); query.add(word,Occur.MUST); query.add(lon, Occur.MUST); query.add(lat, Occur.MUST); //query result TopDocs docs=searcher.search(query, Integer.MAX_VALUE); // docs. // TopDocsCollector<ScoreDoc> //查询所有记录 for(int i=0;i<docs.totalHits;i++){ Document doc=searcher.doc(docs.scoreDocs[i].doc); // System.out.println(doc.get("comp_name")); lst.add(doc); } searcher.close(); d.close(); }catch(Exception e){ System.out.println("查询失败:"+e.toString()); } return lst; }
经纬度范围表达 使用NumericRangeQuery 。中文分词使用IKAnalyzer来搞定。