自定义的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来排序将花费最大的资源。
以下几种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来排序将花费最大的资源。