lucene学习之搜索排序
2013-01-20 20:22
375 查看
import java.io.File; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.NumericField; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.FuzzyQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.PhraseQuery; import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.Sort; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TermRangeQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.WildcardQuery; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.util.Version; public class SearchUtil { private String[] ids = {"1","2","3","4","5","6"}; private String[] emails = {"soukenan@qq.com","li@soukenan.com","804632564@qq.com","admin@qq.com","soukenan@kenan.org","123@df.com"}; private String[] content ={ "Welcome to Kenan my home", "Hello Kenan ", "Good morning", "Are you OK?", "Yeah hahahahahahaha Kenan", "I like foot ball" }; private int[] attachs = {1,4,6,2,3,8}; private Date[] dates = null; private String[] names = {"5555","333","44","111","222","666"}; //词典 private Directory directory = null; //写入笔 private IndexWriter writer = null; //文档对象 private Document doc = null; //读取对象 private IndexReader reader = null; private IndexSearcher searcher = null; private void datesInit() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); dates = new Date[6]; try { dates[0] = sdf.parse("2010-12-01"); dates[1] = sdf.parse("2011-12-01"); dates[2] = sdf.parse("2001-12-01"); dates[3] = sdf.parse("2013-12-01"); dates[4] = sdf.parse("2003-12-01"); dates[5] = sdf.parse("2014-12-01"); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public SearchUtil(){ datesInit(); try { directory = FSDirectory.open(new File("d:/lucene/index01")); this.getSearcher(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 构建索引 */ public void buildIndex(){ try { writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35))); for(int i=0;i<6;i++){ doc = new Document(); doc.add(new Field ("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED)); doc.add(new Field("content",this.content[i],Field.Store.NO,Field.Index.ANALYZED)); doc.add(new Field("name",this.names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); //给数字加索引 doc.add(new NumericField("attach", Field.Store.YES,true).setIntValue(attachs[i])); //给日期加索引 doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(dates[i].getTime())); writer.addDocument(doc); } } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (LockObtainFailedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(writer != null){ try { writer.close(); } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public IndexSearcher getSearcher(){ try { if(reader == null){ reader = IndexReader.open(directory); }else{ IndexReader ir = IndexReader.openIfChanged(reader); if(ir!=null){ reader.close(); reader = ir; } } searcher = new IndexSearcher(reader); return searcher; } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public void queryParse(Query query , int num ,Sort sort){ try { TopDocs tds = null; if(sort!=null){ tds = this.searcher.search(query, num,sort); }else{ tds = this.searcher.search(query, num); } System.out.println("查询到的结果数:"+tds.totalHits); for(ScoreDoc sd : tds.scoreDocs){ doc = this.searcher.doc(sd.doc); System.out.println("id:"+doc.get("id")+"---"+"评分:"+sd.score+"--"+"name:"+doc.get("name")+"---"+"attachs:"+doc.get("attach")+"---"+"email:"+doc.get("email")); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { this.searcher.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.queryParser.QueryParser.Operator; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.apache.lucene.util.Version; import org.junit.BeforeClass; import org.junit.Test; public class TestSearchUtil { static SearchUtil su ; @BeforeClass public static void setUpBeforeClass() throws Exception { su = new SearchUtil(); } @Test public void testBuildIndex(){ su.buildIndex(); } @Test public void testSort() throws Exception{ //创建QueryParser对象 默认的搜索域为content QueryParser parser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35)); //设置 空格的默认操作符为 AND 默认为OR // parser.setDefaultOperator(Operator.AND); //开启第一个字符的通配符配置 parser.setAllowLeadingWildcard(true); //搜索content中包含kenan的 Query query = parser.parse("kenan"); //默认是按照评分排序 su.queryParse(query, 10,null); //按照评分排序 su.queryParse(query, 10, Sort.RELEVANCE); //按照索引排序 默认id来排序 su.queryParse(query, 10, Sort.INDEXORDER); //按照attach的大小排序 升序 su.queryParse(query, 10, new Sort(new SortField("attach", SortField.INT))); //按照attach的大小排序 降序 su.queryParse(query, 10, new Sort(new SortField("attach", SortField.INT,true))); //按照name排序 升序 su.queryParse(query, 10, new Sort(new SortField("name", SortField.STRING))); //按照name排序 降序 su.queryParse(query, 10, new Sort(new SortField("name", SortField.STRING,true))); //按照评分排序 su.queryParse(query, 10, Sort.RELEVANCE); //先按照评分排序 评分相同的,按照attach排序 降序 su.queryParse(query, 10, new Sort(SortField.FIELD_SCORE,new SortField("attach", SortField.INT,true))); } }
本文出自 “Kenan_ITBlog” 博客,请务必保留此出处http://soukenan.blog.51cto.com/5130995/1122899
相关文章推荐
- 一步一步跟我学习lucene(13)---lucene搜索之自定义排序的实现原理和编写自己的自定义排序工具
- lucene6 搜索按照字符串字段排序
- lucene学习笔记(三)lucene搜索查询
- WebGIS中解决使用Lucene进行兴趣点搜索排序的两种思路
- Lucene学习总结之七:Lucene搜索过程解析(3)
- lucene 搜索学习笔记 - OK
- lucene学习之执行搜索
- lucene学习之近实时搜索
- Lucene学习笔记:范围搜索
- Lucene学习总结之七:Lucene搜索过程解析(4)
- Lucene 3.6.2入门:高级搜索之排序
- JAVA:lucene 入门学习,简单实例模访google搜索
- 索引搜索与字符串查找的比较(Lucene学习笔记之一)
- lucene学习,实现淘宝的分条件搜索的功能
- Lucene5 学习笔记(2) —— 简单介绍 Lucene 搜索功能和索引的修改、删除
- 一步一步跟我学习lucene(9)---lucene搜索之拼写检查和相似度查询提示(spellcheck)
- 20、学习Lucene3.5索引之近实时搜索
- 学习搜索开发的重点不在lucene和nutch[ 原创]
- 一步一步跟我学习lucene(11)---lucene搜索之高亮显示highlighter
- Lucene学习总结之七:Lucene搜索过程解析(5)