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);

猜你喜欢

转载自www.cnblogs.com/tele-share/p/9206079.html