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

  • 相关阅读:
    [C#]mouse_event模拟点击时坐标参数无效?!
    体验boost::spirit
    喜讯,公司换宽屏液晶显示器了
    [疑难杂症]扩展AxWebBrowser的问题???
    VS 2005 BUG: 新增JScript文件编码问题引起乱码?
    在JavaScript中实现命名空间
    [C#]实现序列号生成器
    基于Web的仿WF工作流设计器
    分享:基于UDP协议实现可靠的数据传输
    远程控制之屏幕截取 小结
  • 原文地址:https://www.cnblogs.com/tele-share/p/9206079.html
Copyright © 2020-2023  润新知