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