使用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来搞定。