lucene 7.x 排序


一.创建索引

 1 @Test  2     public void indexCreate() throws IOException {  3         //创建分词器
 4         Analyzer analyzer = new StandardAnalyzer();  5         IndexWriterConfig config = new IndexWriterConfig(analyzer);  6         
 7         //指定索引存放目录以及配置参数
 8         Directory directory =FSDirectory.open(Paths.get("F:/luceneIndex"));  9         IndexWriter writer = new IndexWriter(directory,config); 10             
11         //采集数据
12         List<Book> bookList = bookDao.findAll(); 13         /*for (Book book : bookList) { 14  System.out.println(book.getName()); 15  }*/
16         //将采集的数据封装到Document中
17         Document doc = null; 18         for (Book book : bookList) { 19             doc  = new Document(); 20              // store:如果是yes,则说明存储到文档域中 21             //id:不分词,索引,存储
22             Field id = new StringField("id",book.getId().toString(),Store.YES); 23             
24             //name:分词,索引,存储
25             Field name = new TextField("name",book.getName(),Store.YES); 26             //price:不分词,索引,存储,
27             Field price = new FloatPoint("price",book.getPrice()); 28             
29             //pic:不分词,不索引,存储,存储要添加一个同名的StoredField
30             Field pic   = new StoredField("pic",book.getPic()); 31             //desciption:分词,索引,不存储
32             Field description = new TextField("description",book.getDescription(),Store.NO); 33  doc.add(id); 34  doc.add(name); 35  doc.add(price); 36             doc.add(new StoredField("price",book.getPrice()));//存储
37             doc.add(new NumericDocValuesField("price",book.getPrice().longValue()));//排序
38  doc.add(pic); 39  doc.add(description); 40             
41             //生成索引
42  writer.addDocument(doc); 43  } 44         
45         //关闭
46  writer.close(); 47     }

注意:创建索引时,对应price采用了FloatPoint,如果要对此字段进行存储,要添加同名的StoredField,如果要对此字段进行排序,要添加同名的NumericDocValuesField,

否则会报unexpected docvalues type异常

二.排序

 1 //查询
 2  @Test  3     public void indexSearch() throws IOException, ParseException {  4         String[] fields = {"name","description"};  5         MultiFieldQueryParser parser = new MultiFieldQueryParser(fields,new StandardAnalyzer());  6         Query query = parser.parse("lucene");  7         query = parser.parse("java");  8  doSearch(query);  9  } 10     
11     private void doSearch (Query query) { 12  Directory directory; 13         try { 14             directory = FSDirectory.open(Paths.get("F:/luceneIndex")); 15         
16         IndexReader reader = DirectoryReader.open(directory); 17         //创建IndexSearcher
18         IndexSearcher searcher = new IndexSearcher(reader); 19         //true表示降序 20         //SortField.Type.SCORE 根据相关度进行排序(默认) 21         //SortField.Type.DOC 根据文档编号或者说是索引顺序 22         //SortField.Type.FLOAT(Long等),根据fieldName的数值类型进行排序
23         SortField sortField = new SortField("price",SortField.Type.FLOAT,true); 24         Sort sort = new Sort(sortField); 25         TopDocs topDocs = searcher.search(query,10,sort); 26         long count = topDocs.totalHits; 27         System.out.println("匹配的总条数是----" + count); 28         
29         //根据相关度排序后的结果
30         ScoreDoc[] docs = topDocs.scoreDocs; 31         for (ScoreDoc scoreDoc : docs) { 32             int docId = scoreDoc.doc; 33             Document document = searcher.doc(docId); 34             System.out.println("id----"+document.get("id")); 35             System.out.println("name----"+document.get("name")); 36             System.out.println("price----"+document.get("price")); 37             /*System.out.println("pic----"+document.get("pic")); 38  System.out.println("description----"+document.get("description"));*/
39             System.out.println("======================"); 40  } 41  reader.close(); 42         } catch (IOException e) { 43             // TODO Auto-generated catch block
44  e.printStackTrace(); 45  } 46         
47     }

此外还有

//Sort.RELEVANCE 根据相关度排序
//Sort.INDEXORDER 根据索引顺序排序
TopDocs topDocs = searcher.search(query,10,Sort.INDEXORDER);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM