一.创建索引

 @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. 程序中图片透明 函数(使用SetBkColor API函数)

    void DrawTransparentBitmap(HDC  hdc,  HBITMAP  hBitmap,  short  xStart,  short  yStart,  COLORREF  c ...

  2. 扩展的方法:es6 安装模块builder

    https://github.com/es-shims/es5-shim/ Image.png 检测浏览器可支持es5,不支持就扩展,做兼容: 扩展的方法: Image.png 取所有对象的键值: o ...

  3. Spring Boot集成EHCache实现缓存机制

    SpringBoot 缓存(EhCache 2.x 篇) SpringBoot 缓存 在 Spring Boot中,通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManag ...

  4. Spring Boot 静态资源处理(转)

    Spring Boot 静态资源处理 Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring Bo ...

  5. sbt教程

      更详细内容请见:http://www.scala-sbt.org/0.13/tutorial/Basic-Def.html 或者 http://wenku.baidu.com/link?url=o ...

  6. 使用perl读取Excel

    使用perl读取Excel 环境 windows 7 ActiveState Perl Win32::OLE[perl package] 基本功能 循环处理多个sheet 读取Excel单元,提取in ...

  7. 设置secureCRT中vim的字体颜色 分类: B3_LINUX 2014-07-12 22:01 1573人阅读 评论(0) 收藏

    1.在/etc/vimrc新增以下一行 syntax on 注:上述方法对root用户无效,原因为在一般用户中,alias vi=vim,而在root用户中默认无此设置,因此若需要root用户也显示颜 ...

  8. text输入框改变事件

    前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onke ...

  9. How to use ftp in a shell script

    转载How to use ftp in a shell script How to use ftp in a shell script Bruce EdigerBruce Ediger's home ...

  10. 卸载、指定卸载 .NET Core Runtime and SDK

    原文:卸载.指定卸载 .NET Core Runtime and SDK 项目使用的 Nuget 包,比如 Microsoft.AspNetCore.App等的版本号要与 .NET Core 版本号( ...