Lucene之拉框查询

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

原文地址:https://www.cnblogs.com/likehua/p/2730192.html