sinat_37570156 2018-02-06 01:39 采纳率: 0%
浏览 850
已结题

lucene/IK查询怎么在得分一样的情况下按照另一个字段排序

最近刚开始学习Lucene, 是按照IK6.5分词保存索引和查询,现在默认查询是按照命
中分数排序,可是还有一个字段是记录浏览次数的,就是当一条记录被浏览的次数多就应该出现在最上面,相当于要对这个字段进行排序,这个可以更新索引,但是查询的时
候怎么样在分数一样的情况下对另一个字段进行排序?
Sort在这里怎么用,用Sort之后就一条也查不出来了,不用就可以正常查询!
SortField sortField = new SortField("checkTimes", SortField.Type.STRING,true);
org.apache.lucene.search.Sort sort = new org.apache.lucene.search.Sort(sortField);
TopDocs topDocs = indexSearcher.search(query, 20, sort);

  • 写回答

2条回答

  • GuanfaLi 2018-02-06 03:27
    关注

    Lucene的默认排序是按照Document的得分进行排序的。当检索结果集中的两个Document的具有相同的得分时,默认按照Document的ID对结果进行排序。
    下面研究几种设置/改变检索结果排序的方法。
    1、改变Document的boost(激励因子)
    改变boost的大小,会导致Document的得分的改变,从而按照Lucene默认的对检索结果集的排序方式,改变检索结果中Document的排序的提前或者靠后。在计算得分的时候,使用到了boost的值,默认boost的值为1.0,也就说默认情况下Document的得分与boost的无关的。一旦改变了默认的boost的值,也就从Document的得分与boost无关,变为相关了:boost值越大,Document的得分越高。
    2、改变Field的boost(激励因子)
    改变Field的boost值,和改变Document的boost值是一样的。因为Document的boost是通过添加到Docuemnt中Field体现的,所以改变Field的boost值,可以改变Document的boost值。
    3、使用Sort排序工具实现排序
    Lucene在查询的时候,可以通过以一个Sort作为参数构造一个检索器IndexSearcher,在构造Sort的时候,指定排序规则。
    调用sort进行排序的方法是IndexSearcher.search,例如:
    IndexSearcher.search(query,sort);
    关于Sort类,在其内部定义了6种构造方法:
    public Sort() //
    public Sort(SortField field) //通过构造某个域(field)的SortField对象根据一个域进行排序
    public Sort(SortField[] fields) //通过构造一组域(field)的SortField对象组实现根据多个域排序
    public Sort(String field) //根据某个域(field)的名称构造Sort进行排序
    public Sort(String field, boolean reverse) //根据某个域(field)的名称构造SortField进行排序,reverse为true为升序
    public Sort(String[] fields) //根据一组域(field)的名称构造一组Sort进行排序
    4、直接使用SortField实现排序
    关于SortField类,在其内部定义了7种构造方法:
    public SortField (String field, boolean reverse)//根据某个域(field)的名称构造SortField, reverse为false为升序
    public SortField (String field, int type)
    public SortField (String field, int type, boolean reverse)
    public SortField (String field, Locale locale)
    public SortField (String field, Locale locale, boolean reverse)
    public SortField (String field, SortComparatorSource comparator)
    public SortField (String field, SortComparatorSource comparator, boolean reverse)
    type对应的值分别为:
    SortField. SCORE 按积分排序
    SortField. DOC 按文档排序
    SortField. AUTO 域的值为int、long、float都有效
    SortField.STRING 域按STRING排序
    SortField..FLOAT
    SortField.LONG
    SortField.DOUBLE
    SortField.SHORT
    SortField.CUSTOM 通过比较器排序
    SortField.BYTE
    5、自定义排序
    Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和ScoreDocComparator接口.在了解具体实现方法之前先来看看这两个接口的定义吧

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!