前提:不对结果做sort操作.
在搜索中,并不是所有的Document和Fields都是平等的.有些技术会要求到对其Doucment或者Fields的权值改变,
默认值为:1.0F,以上需求都是通过改变Document的boost因子来改变的. 下面是通过lucene3.0,IKAnalyzer
1.通过设置doc boost改变排序结果
/**
* 设置DOC boost 值影响查询排序结果
* @throws Exception
*/
public void testBoost1() throws Exception{
System.out.println("设置DOC boost 值影响查询排序结果");
RAMDirectory ramDir = new RAMDirectory();
Analyzer analyzer = new IKAnalyzer();
IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);
String[] nameList = { "you are my friend", "a are my wife", "I love you" };
String[] addList = { "b", "you are my wife", "c" };
String[] fileList = { "1", "2", "3" };
for (int i = 0; i < nameList.length; i++){
Document doc = new Document();
doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));
if (i == 2) {
doc.setBoost(2.0f);
}
// 这里设置了第三个文档优先级最高,所以在搜索出来的结果中,该文档排在最前
iw.addDocument(doc);
}
iw.close();
IndexSearcher _searcher = new IndexSearcher(ramDir);
String[] fields =new String[]{"name","address"};
Query query=IKQueryParser.parseMultiField(fields, "you");
TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());
ScoreDoc[] hits = topDocs.scoreDocs;
for (int i = 0; i < hits.length; i++) {
Document doc = _searcher.doc(hits[i].doc);
System.out.println("name:"+doc.get("name"));
System.out.println("file:"+doc.get("file"));
}
_searcher.close();
}
if (i == 2) { doc.setBoost(2.0f); }这样I love you 将先输出,
2.通过设置query 影响排序
/**
* 设置query boost值影响排序结果,如果有排序sort,则完全按照sort结果进行
* @throws Exception
*/
public void testBoost2() throws Exception{
System.out.println("设置query boost值影响排序结果");
RAMDirectory ramDir = new RAMDirectory();
Analyzer analyzer = new IKAnalyzer();
IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);
String[] nameList = { "you are my friend", "a are my wife", "I love you" };
String[] addList = { "b", "you are my wife", "c" };
String[] fileList = { "1", "2", "3" };
for (int i = 0; i < nameList.length; i++)
{
Document doc = new Document();
doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));
iw.addDocument(doc);
}
iw.close();
IndexSearcher _searcher = new IndexSearcher(ramDir);
BooleanQuery bq = new BooleanQuery();
QueryParser _parser = new QueryParser(Version.LUCENE_30,"name",analyzer);
Query _query = _parser.parse("you");
_query.setBoost(2f);
QueryParser _parser1 = new QueryParser(Version.LUCENE_30,"address",analyzer);
Query _query1 = _parser1.parse("you");
_query1.setBoost(1f);
bq.add(_query, BooleanClause.Occur.SHOULD);
bq.add(_query1, BooleanClause.Occur.SHOULD);
//
// for(int i=0;i<2;i++){
// QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30,new String[] {"name", "address" }, analyzer);
// Query q1 = parser.parse("you");
// bq.add(q1, BooleanClause.Occur.MUST);
// }
//
// SortField[] sortFields = new SortField[1];
// SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序
// sortFields[0] = sortField;
// Sort sort = new Sort(sortFields);
// TopDocs topDocs = _searcher.search(bq,null,_searcher.maxDoc(),sort);
//
TopDocs topDocs = _searcher.search(bq,_searcher.maxDoc());
ScoreDoc[] hits = topDocs.scoreDocs;
for (int i = 0; i < hits.length; i++) {
Document doc = _searcher.doc(hits[i].doc);
System.out.println("name:"+doc.get("name"));
System.out.println("file:"+doc.get("file"));
}
_searcher.close();
}
结果如下:(name 的boost最高,所以name优先于address排序在前面)
设置query boost值影响排序结果
name:you are my friend
file:1
name:I love you
file:3
name:a are my wife
file:2
3.通过设置fields 的boost 影响排序
/**
* 设置field boost 值影响查询排序结果,有排序则按照排序
* @throws Exception
*/
//没设置field boost 213 设置后是132
public void testBoost3() throws Exception{
System.out.println("设置fields boost 值影响查询排序结果");
RAMDirectory ramDir = new RAMDirectory();
Analyzer analyzer = new IKAnalyzer();
IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);
String[] nameList = { "you are my friend", "a are my wife", "I love you" };
String[] addList = { "b", "you are my wife", "c" };
String[] fileList = { "1", "2", "3" };
for (int i = 0; i < nameList.length; i++)
{
Document doc = new Document();
Field nameField = new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED);
nameField.setBoost(20f);
doc.add(nameField);
doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));
Field f = new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED);
f.setBoost(30f);
doc.add(f);
iw.addDocument(doc);
}
iw.close();
IndexSearcher _searcher = new IndexSearcher(ramDir);
String[] fields =new String[]{"name","file","address"};
Query query=IKQueryParser.parseMultiField(fields, "you");
// SortField[] sortFields = new SortField[1];
// SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序
// sortFields[0] = sortField;
// Sort sort = new Sort(sortFields);
// TopDocs topDocs = _searcher.search(query,null,_searcher.maxDoc(),sort);
TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());
ScoreDoc[] hits = topDocs.scoreDocs;
for (int i = 0; i < hits.length; i++) {
Document doc = _searcher.doc(hits[i].doc);
System.out.println("name:"+doc.get("name"));
System.out.println("file:"+doc.get("file"));
}
_searcher.close();
}
结果如下:(address 的boost最高,先排在前面了)
设置fields boost 值影响查询排序结果
name:a are my wife
file:2
name:you are my friend
file:1
name:I love you
file:3
分享到:
相关推荐
传统上,人们将信息检索系统返回结果的排序称为"相关排序" (relevance ranking) ,隐含其中各条目的顺序反映结果和查询的相关程度。
lucene自定义排序实现,大家有兴趣关注我的博客http://blog.csdn.net/wuyinggui10000/article/category/3173543
而我们可以将这两种方式结合下,每次查询都多缓存一部分的结果集,翻页的时候看看所查询的内容是不是在已经存在在缓存当中,如果已经存在了就直接拿出来,如果不存在,就进行查询后,从缓存中读出来. 比如:现在我们有一个...
在一定深度介绍LUCENE的排序算法和打分公式。
Lucene0之结果排序.pdf
lucene4.3 按坐标距离排序,里面写了个简单的例子。运行就行
lucene的排序过滤和分页,lucene开发技术,lucene下载
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
lucene的查询语法事例.
Lucene根据关键词出现次数排序以及自定义排序,可以自定义优先级,包含list字段排序与pom等
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎
lucene排序、设置权重、优化、分布式搜索.pdf
lucene 做索引查询流程,来自《lucene in action》
利用lucene进行搜索,IndexSearcher是整个Lucene搜索查询相关信息的驱动引擎,在使IndexSearcher之前,需要构建IndexSearcher对象,Lucene提供了两种构建IndexSearcher对象的方式: 1、基于Directory对象构建; 2...
2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。 3.MUST_NOT和MUST_NOT:无意义,检索无结果。 4.SHOULD与MUST、SHOULD与MUST_NOT: SHOULD与MUST连用时,无意义,结果为MUST子句...
Lucene3.0之查询处理(1):原理和查询类型 各种Query对象详解
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
NULL 博文链接:https://iamyida.iteye.com/blog/2201372
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...