Lucence
1、分页
oracle中10-19条记录的sql语句
select * from ( select g.*,rownum as rn from goods g where rownum<20) g1 where g1.rn>9
示例:
public List<Goods> queryPage(String name,int pageIndex,int pageSize) { List<Goods>goodses = new ArrayList<Goods>(); IndexSearchersercher=null; if(pageIndex<1){ pageIndex=1; } //查询页的开始记录数的序号 int startRecord = (pageIndex-1)*pageSize; //查询页的结束记录数序号 int endRecord = pageIndex*pageSize;
try {
sercher = new IndexSearcher(Configuration.getDIRECTORY()); // 查询解析器,参数一:版本号,一般选择最高,参数二:需要查询的字段名,参数三:解析器 QueryParser parset = new QueryParser(Configuration.LOCAL_VERSION, "goodsName", Configuration.ANALYZER); // 把查询关键字(term)交给查询解析器 Query query = parset.parse(name);
// 查询索引库,参数一:指定的查询解析器,参数二:指定返回记录条数 TopDocstopDosc = sercher.search(query, endRecord);
System.out.println("实际在库中匹配的总记录数:" + topDosc.totalHits); if(topDosc.totalHits<=startRecord){ System.out.println("没有记录了!"); return null; } if(endRecord>topDosc.totalHits){ endRecord=topDosc.totalHits; }
ScoreDoc[]scoreDocs = topDosc.scoreDocs; System.out.println("返回的记录数ID总数:" + scoreDocs.length);
for (int i=startRecord;i<endRecord;i++) { System.out.println("当前的文档积分为:" + scoreDocs[i].score + ",当前的文档编号为:" +scoreDocs[i].doc); // 根据文档编写查询真正的文档对象 Document document = sercher.doc(scoreDocs[i].doc); Goodsgoods = (Goods) BeanUtils.documentToBean(document, Goods.class); System.out.println("page 内容:"+goods); goodses.add(goods); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { sercher.close(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return goodses; } |
2、排序与多字段查询
public List<Goods> queryGoodsListUseSort(String queryWord) {
List<Goods> goodses = new ArrayList<Goods>(); IndexSearcher indexSearcher = null; try { indexSearcher = new IndexSearcher(Configuration.getDIRECTORY());
//创建排序字段,参数一:指定排序字段;参数二:字段类型;参数三:设置升序或子降序,true为降序 SortField goodsId = new SortField("goodsId",SortField.INT,true); //创建排序字段,默认为升序 SortField goodsPrice = new SortField("goodsPrice", SortField.DOUBLE);
Sort sort = new Sort(); //设置排序字段到sort对象中,排序的优先级,前者优先于后者 sort.setSort(goodsId,goodsPrice);
//使用IKQueryParser进行多字段数据查询 Queryquery = IKQueryParser.parseMultiField(newString[]{"goodsName","goodsRemark"},queryWord);
//执行查询,返回20条记录,加入排序设置信息 TopDocs topDocs = indexSearcher.search(query, null,20,sort);
System.out.println("共匹配的记录:" + topDocs.totalHits);
ScoreDoc[] scoreDoces = topDocs.scoreDocs; for (ScoreDoc scoreDoc : scoreDoces) { System.out.println("score:" + scoreDoc.score + "|doc:" +scoreDoc.doc); Documentdocument = indexSearcher.doc(scoreDoc.doc); Goodsgoods = (Goods) BeanUtils.documentToBean(document, Goods.class); goodses.add(goods); }
} catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { indexSearcher.close(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
return goodses; } |
3、高亮
public List<Goods> queryGoodsListReturnHighLight(String queryWord) {
List<Goods> goodses = new ArrayList<Goods>(); IndexSearcher indexSearcher = null; try { indexSearcher = new IndexSearcher(Configuration.DIRECTOTY);
//创建排序字段,参数一:指定排序字段;参数二:字段类型;参数三:设置升序或子降序,true为降序 SortField goodsId = new SortField("goodsId",SortField.INT,true); //创建排序字段,默认为升序 SortField goodsPrice = new SortField("goodsPrice", SortField.DOUBLE);
Sort sort = new Sort(); //设置排序字段到sort对象中,排序的优先级,前者优先于后者 sort.setSort(goodsId,goodsPrice);
//使用IKQueryParser进行多字段数据查询 Queryquery = IKQueryParser.parseMultiField(new String[]{"goodsName","goodsRemark"},queryWord);
//执行查询,加入排序设置信息 TopDocs topDocs = indexSearcher.search(query, null,20,sort);
System.out.println("共匹配的记录:" + topDocs.totalHits);
ScoreDoc[]scoreDoces = topDocs.scoreDocs; for (ScoreDoc scoreDoc : scoreDoces) { System.out.println("score:" + scoreDoc.score + "|doc:" +scoreDoc.doc); Documentdocument = indexSearcher.doc(scoreDoc.doc);
//设置高亮的格式 Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>"); //指定查询信息 Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer); //指定高亮后的长度,需要SimpleFragmenter类型参数,这里指定长度为20字 highlighter.setTextFragmenter(newSimpleFragmenter(20)); //设置对哪个字段进行高亮操作,返回高亮后的结果 String nameResult = highlighter.getBestFragment(Configuration.ANALYZER,"goodsName", document.get("goodsName")); String remarkResult = highlighter.getBestFragment(Configuration.ANALYZER,"goodsRemark", document.get("goodsRemark"));
System.out.println("namereuslt"+nameResult); System.out.println("remarkreuslt"+remarkResult);
//把高亮后的值重新赋给字段,如果没有高亮,将使用原值 if(nameResult!=null){ document.getField("goodsName").setValue(nameResult); }else{ if(document.get("goodsName")!=null&&document.get("goodsName").length()>=20){ document.getField("goodsName").setValue(document.get("goodsName").substring(0,20)); }else{ document.getField("goodsName").setValue(document.get("goodsName")); } } if(remarkResult!=null){ document.getField("goodsRemark").setValue(remarkResult); }else{ if(document.get("goodsRemark")!=null&&document.get("goodsRemark").length()>=20){ document.getField("goodsRemark").setValue(document.get("goodsRemark").substring(0,20)); }else{ document.getField("goodsRemark").setValue(document.get("goodsRemark")); } }
Goodsgoods = (Goods) BeanUtil.DocumentToBean(document, Goods.class); goodses.add(goods); }
} catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { indexSearcher.close(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
return goodses; } |