lucene 7.x 排序
一.创建索引
@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 排序的更多相关文章
- lucene 查询+分页+排序
lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...
- Lucene 08 - 什么是Lucene的相关度排序 + Java API调整相关度
目录 1 什么是相关度 2 相关度评分 3 相关度设置 3.1 更改相关度的需求 3.2 实现需求-设置广告 1 什么是相关度 概念: 相关度指两个事物之间的关联关系(相关性). Lucene中指的是 ...
- Lucene - CustomScoreQuery 自定义排序
在某些场景需要做自定义排序(非单值字段排序.非文本相关度排序),除了自己重写collect.weight,可以借助CustomScoreQuery. 场景:根据tag字段中标签的数量进行排序(tag字 ...
- Lucene 中自定义排序的实现
使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...
- lucene整理3 -- 排序、过滤、分词器
1. 排序 1.1. Sort类 public Sort() public Sort(String field) public Sort(String field,Boolean reverse ...
- 【lucene系列学习】排序
用lucene3实现搜索多字段并排序功能(设置权重)
- 原创:史上对BM25模型最全面最深刻的解读以及lucene排序深入讲解
垂直搜索结果的优化包括对搜索结果的控制和排序优化两方面,其中排序又是重中之重.本文将全面深入探讨垂直搜索的排序模型的演化过程,最后推导出BM25模型的排序.然后将演示如何修改lucene的排序源代码, ...
- 【Lucene】Apache Lucene全文检索引擎架构之构建索引2
上一篇博文中已经对全文检索有了一定的了解,这篇文章主要来总结一下全文检索的第一步:构建索引.其实上一篇博文中的示例程序已经对构建索引写了一段程序了,而且那个程序还是挺完善的.不过从知识点的完整性来考虑 ...
- lucene4.7学习总结
花了一段时间学习lucene今天有时间把所学的写下来,网上有很多文章但大部分都是2.X和3.X版本的(当前最新版本4.9),希望这篇文章对自己和初学者有所帮助. 学习目录 (1)什么是lucene ( ...
随机推荐
- 2.JPA学习总结
转自:https://shmilyaw-hotmail-com.iteye.com/blog/1969190 前言 最近在做一个项目的时候因为牵涉到要对数据库的操作,在最开始实现的时候采用了直接的JD ...
- 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhange ...
- angular 设置全局常量
一:在项目核心文件core.module.ts中设置全局静态常量 解释:相当于自动注入到inject中. providers:[ { provide:'BASE_CONFIG', useValue:' ...
- Python 极简教程(三)数据类型
每种语言都有各种数据类型.这就像在现实生活中,我们计数的时候需要用到数字,在表述金额.重量.距离等需要精确计数时用到小数,在日常交谈中要用文字,等等.在计算机语言中,为了表述不同的情况,也需要用到各种 ...
- 【习题5-5 UVA-10391】Compound Words
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举每一个串的分割点. 看看左右两个串在不在字符串中即可. [代码] #include <bits/stdc++.h> ...
- ScrollView ViewPager ListView三者共存的问题
随喜结佛缘 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlueXVueWluZw==/font/5a6L5L2T/fontsize/400/fill/ ...
- keil出错总结
错误一: ..\APP\app.c(51): error: #268: declaration may not appear after executable statement in block ...
- int to str
string int2str( int num){ if (num == 0 ) return " 0 " ; string str = "" ; int nu ...
- CComboBox自动匹配
void CLoadPhotoDlg::OnCbnEditchangeCombo1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); CComboBox ...
- hdu 2577 How to Type(DP)
How to Type Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...