lucene4.7 之排序(四)
关于上图中乱码字符原因是因为默认排序情况下lucene是不会对搜索结果进行评分操作的,因为评分操作会降低性能,所以关于score的那一列返回的是NAN的字符串
TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);
6,带评分的排序,注意后面两个布尔类型的变量可以控制是否评分,特别是在没有要求需要打分时,建议别开启,大数量时对性能影响较大,检索“编程”得到的结果,默认按评分降序排序
Please read full article from lucene4.7 之排序(四)
Sort里的属性 | SortField里的属性 | 含义 |
Sort.INDEXORDER | SortField.FIELD_DOC | 按照索引的顺序进行排序 |
Sort.RELEVANCE | SortField.FIELD_SCORE | 按照关联性评分进行排序 |
=========SortField类============
//field是排序字段type是排序类型
public
SortField(String field, Type type);
//field是排序字段type是排序类型reverse是指定升序还是降序
//reverse 为true是降序 false为升序
public
SortField(String field, Type type,
boolean
reverse)
=========Sort类============
public
Sort();
//Sort对象构造方法默认是按文档评分排序
public
Sort(SortField field);
//排序的一个SortField
public
Sort(SortField... fields)
//排序的多个SortField可以传入一个数组
=========IndexSearche类r========
//query是查询的Query对象 filter是过滤 n返回的数量 sort是排序
search(Query query, Filter filter,
int
n, Sort sort)
//doDocScores 为true情况下每个命中的结果下都会被评分
//doMaxScore 为true情况下对最大分值的搜索结果进行评分
search(Query query, Filter filter,
int
n, Sort sort,
boolean
doDocScores,
boolean
doMaxScore)
使用默认的关联性评分后,核心代码和运行效果图如下:
1
2
| Sort sort= new Sort(); //默认使用关联性评分 |
Sort sort=
new
Sort(
new
SortField(
"date"
, Type.INT,
true
));
//true为降序排列
TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);
Sort sort=
new
Sort(
new
SortField(
"price"
, Type.DOUBLE,
false
));
//false为降序排列
TopDocs topDocs=searcher.search(
new
MatchAllDocsQuery(),
10000
,sort);
// Sort sort=new Sort(new SortField("date", Type.INT, true),new SortField("ename", Type.STRING, false));
//这两段代码效果一样
Sort sort=
new
Sort(
new
SortField[]{
new
SortField(
"date"
, Type.INT,
true
),
new
SortField(
"ename"
, Type.STRING,
false
)});
TopDocs topDocs=searcher.search(
new
MatchAllDocsQuery(),
10000
,sort);
Sort sort=Sort.RELEVANCE; TopDocs topDocs=searcher.search( new TermQuery( new Term( "bookname" , "编程" )), null , 100 ,sort, true , true );
|
7,注意几点
(1)排序对一个文档里什么域都没存储,使用字符串排序会排在首位
(2)排序对一个文档里什么域都没存储,使用数字类型排序会默认给其赋值为0进行排序
(3)我们可以对数字类型的null值的文档进行代码控制,可以将其设置为最大,所以将会排在最后面,代码如下
(1)排序对一个文档里什么域都没存储,使用字符串排序会排在首位
(2)排序对一个文档里什么域都没存储,使用数字类型排序会默认给其赋值为0进行排序
(3)我们可以对数字类型的null值的文档进行代码控制,可以将其设置为最大,所以将会排在最后面,代码如下
1
2
| SortField sortField = new SortField( "value" , SortField.Type.INT); sortField.setMissingValue(Integer.MAX_VALUE); |
No comments:
Post a Comment