zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    《软件性能测试与LoadRunner实战教程》新书上市
    《你必须掌握的Entity Framework 6.x与Core 2.0》正式出版感想
    《你必须掌握的Entity Framework 6.x与Core 2.0》书籍出版
    别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
    EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
    已被.NET基金会认可的弹性和瞬态故障处理库Polly介绍
    WebAPi之SelfHost自创建证书启动Https疑难解惑及无法正确返回结果
    Web APi之认证(Authentication)两种实现方式【二】(十三)
    读懂操作系统之虚拟内存TLB与缓存(cache)关系篇(四)
    读懂操作系统之缓存原理(cache)(三)
  • 原文地址:https://www.cnblogs.com/tele-share/p/9206079.html
Copyright © 2011-2022 走看看