一.创建索引

 @Test
public void indexCreate() throws IOException {
//创建分词器
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer); //指定索引存放目录以及配置参数
Directory directory =FSDirectory.open(Paths.get("F:/luceneIndex"));
IndexWriter writer = new IndexWriter(directory,config); //采集数据
List<Book> bookList = bookDao.findAll();
/*for (Book book : bookList) {
System.out.println(book.getName());
}*/
//将采集的数据封装到Document中
Document doc = null;
for (Book book : bookList) {
doc = new Document();
// store:如果是yes,则说明存储到文档域中
//id:不分词,索引,存储
Field id = new StringField("id",book.getId().toString(),Store.YES); //name:分词,索引,存储
Field name = new TextField("name",book.getName(),Store.YES);
//price:不分词,索引,存储,
Field price = new FloatPoint("price",book.getPrice()); //pic:不分词,不索引,存储,存储要添加一个同名的StoredField
Field pic = new StoredField("pic",book.getPic());
//desciption:分词,索引,不存储
Field description = new TextField("description",book.getDescription(),Store.NO);
doc.add(id);
doc.add(name);
doc.add(price);
doc.add(new StoredField("price",book.getPrice()));//存储
doc.add(new NumericDocValuesField("price",book.getPrice().longValue()));//排序
doc.add(pic);
doc.add(description); //生成索引
writer.addDocument(doc);
} //关闭
writer.close();
}

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

否则会报unexpected docvalues type异常

二.排序

 //查询
@Test
public void indexSearch() throws IOException, ParseException {
String[] fields = {"name","description"};
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields,new StandardAnalyzer());
Query query = parser.parse("lucene");
query = parser.parse("java");
doSearch(query);
} private void doSearch (Query query) {
Directory directory;
try {
directory = FSDirectory.open(Paths.get("F:/luceneIndex")); IndexReader reader = DirectoryReader.open(directory);
//创建IndexSearcher
IndexSearcher searcher = new IndexSearcher(reader);
//true表示降序
//SortField.Type.SCORE 根据相关度进行排序(默认)
//SortField.Type.DOC 根据文档编号或者说是索引顺序
//SortField.Type.FLOAT(Long等),根据fieldName的数值类型进行排序
SortField sortField = new SortField("price",SortField.Type.FLOAT,true);
Sort sort = new Sort(sortField);
TopDocs topDocs = searcher.search(query,10,sort);
long count = topDocs.totalHits;
System.out.println("匹配的总条数是----" + count); //根据相关度排序后的结果
ScoreDoc[] docs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : docs) {
int docId = scoreDoc.doc;
Document document = searcher.doc(docId);
System.out.println("id----"+document.get("id"));
System.out.println("name----"+document.get("name"));
System.out.println("price----"+document.get("price"));
/*System.out.println("pic----"+document.get("pic"));
System.out.println("description----"+document.get("description"));*/
System.out.println("======================");
}
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

此外还有

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

lucene 7.x 排序的更多相关文章

  1. lucene 查询+分页+排序

    lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...

  2. Lucene 08 - 什么是Lucene的相关度排序 + Java API调整相关度

    目录 1 什么是相关度 2 相关度评分 3 相关度设置 3.1 更改相关度的需求 3.2 实现需求-设置广告 1 什么是相关度 概念: 相关度指两个事物之间的关联关系(相关性). Lucene中指的是 ...

  3. Lucene - CustomScoreQuery 自定义排序

    在某些场景需要做自定义排序(非单值字段排序.非文本相关度排序),除了自己重写collect.weight,可以借助CustomScoreQuery. 场景:根据tag字段中标签的数量进行排序(tag字 ...

  4. Lucene 中自定义排序的实现

    使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...

  5. lucene整理3 -- 排序、过滤、分词器

    1.    排序 1.1. Sort类 public Sort() public Sort(String field) public Sort(String field,Boolean reverse ...

  6. 【lucene系列学习】排序

    用lucene3实现搜索多字段并排序功能(设置权重)    

  7. 原创:史上对BM25模型最全面最深刻的解读以及lucene排序深入讲解

    垂直搜索结果的优化包括对搜索结果的控制和排序优化两方面,其中排序又是重中之重.本文将全面深入探讨垂直搜索的排序模型的演化过程,最后推导出BM25模型的排序.然后将演示如何修改lucene的排序源代码, ...

  8. 【Lucene】Apache Lucene全文检索引擎架构之构建索引2

    上一篇博文中已经对全文检索有了一定的了解,这篇文章主要来总结一下全文检索的第一步:构建索引.其实上一篇博文中的示例程序已经对构建索引写了一段程序了,而且那个程序还是挺完善的.不过从知识点的完整性来考虑 ...

  9. lucene4.7学习总结

    花了一段时间学习lucene今天有时间把所学的写下来,网上有很多文章但大部分都是2.X和3.X版本的(当前最新版本4.9),希望这篇文章对自己和初学者有所帮助. 学习目录 (1)什么是lucene ( ...

随机推荐

  1. linux cmd cp -a

    cp -a 在保留原文件属性的前提下复制文件    cp -r dirname destdir   复制目录后其文件属性会发生变化 想要使得复制之后的目录和原目录完全一样,可以使用cp -a dirn ...

  2. js中的$符号代表什么

    js中的$符号代表什么 一.总结 1.$:相当于document.getElementById(...) 2.$常用用法:每句话意思下面有,好东西 $("div p"); // ( ...

  3. 年轻By塞缪尔·厄尔曼

    年轻,并非人生旅程的一段时光,也并非粉颊红唇和体魄的矫健. 它是心灵中的一种状态,是头脑中的一个意念,是理性思维中的创造潜力,是情感活动中的一股勃勃的朝气,是人生春色深处的一缕东风. 年轻,意味着甘愿 ...

  4. 8.5 Android灯光系统_源码分析_通知灯

    参考文章(应用程序举例)how to use the LED with Android phonehttp://androidblogger.blogspot.jp/2009/09/tutorial- ...

  5. 8.1 Android灯光系统_总体框架

    1.框架 APP(java语言实现) ------------------------------- JNI(c++语言实现)     向上提供Java执行c函数的接口  向下访问HAL ------ ...

  6. 【习题 3-4 UVA - 455】Periodic Strings

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举 [代码] #include <bits/stdc++.h> using namespace std; const ...

  7. Java反射学习总结三(静态代理)

    反射最常见的应用就是代理模式了. 本文先简单介绍一下代理模式,并写一个静态代理的例子.为下一篇重要的动态代理做点铺垫 代理模式的作用是: 为其他对象提供一种代理以控制对这个对象的访问. 另外在某些情况 ...

  8. 闪回drop恢复表后sql运行计划异常

    -----正常运行计划 set autotrace traceonly set linesize 1000 select /*+index(t idx_object_id)*/ * from t wh ...

  9. Need ffmpeg exe. You can download it by calling: imageio.plugins.ffmpeg.download()

    该问题 Need ffmpeg exe. You can download it by calling: imageio.plugins.ffmpeg.download()往往出现在在调用 impor ...

  10. [Docker] Download and Remove Docker Images

    Learn the basics of downloading and pulling Docker images from Docker Hub. Learn the difference betw ...