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