自定义的Sort对象

首先,我们应该有一个概念,在Lucene的内置排序方法中,升降序规则默认都是natural ording,即在Sorting by relevance中默认desc,在其他排序中则是asc。
    1.Sorting by relevance,中文可以叫"适当的排序"?好象有点别扭,呵呵.这也是Lucene的默认排序,即按评分结果倒序排列.
      以下几种search方法都是实现的同样的效果:
      search(Query query,null),search(Query query,Sort.RELEVANCE),search(Query query,new Sort())
      结果首先按照评分结果desc排序,如果评分相同,则按照document id asc排序,其中,document id是document在索引时的先后顺序。
    2.Sorting by index order,按照索引的先后顺序asc排列。
    3.Sorting by a field,按field排序。field是在索引时建立的单元。这里需要注意的一点是,如果想按照field来排序,需要几个规则:首先,这个 field必须是indexed and not tokenized,就是需要索引,但是不能分词,例如Field.KEYWORD()方法;这个field必须可以转换成 Integers,Floats,Strings,可以在用Field生成Sort对象的时候指定field的类型。
   
    正像前边提到的,在lucene中的默认结果升降序规则是natural ording,当然我们也可以自己指定排序的升降序规则。
    首先,我们指定结果按照某一个field来desc排序(如果不指定,field是按照asc排序)。例 如,IndexSearcher.search(Query query,new Sort("date",true)),这里参数true的作用既是使得结果按照date field按照降序排列,这样我们就可以将日期最近的结果排列到最前面。
    通常,排序规则不会这么简单。例如,在某一个图书查询系统中,我们需要的排序规则是,首先按照图书的目录排序,然后同一目录的图书按照评分结果排序,评分结果相同并且目录相同的图书按照出版日期降序排列,代码片段如下:
    indexSearcher.search(Query query,new Sort(
        new SortField[]{
            new SortField("category"),
            SortField.FIELD_SCORE,
            new SortField("pubmonth", SortField.INT, true)
        }
    )
    这里,我们指定了一个SortField的数组,图书目录按照字典升序排列,然后目录相同的按照评分结果降序排列,最后按照出版日期降序排列。
    其实,在lucene内部自动维护了一个排序的数组,只是在这个例子中,我们显示的指定了排序的规则而已。

    排序对查询性能的影响。排序需要额外的资源消耗,更多的内存消耗。lucene只是缓存实际需要排序的field。即使如此,如果需要自定义排序,仍然需要仔细的规划,记住,按照一个String来排序将花费最大的资源。
posted @ 2012-08-01 15:55  lcuzhanglei  阅读(499)  评论(0编辑  收藏  举报