-
相关度排序
Searcher的explain方法,解释文档得分的具体情况。
文档得分主要由4个部分内容来决定,即tf(词条频率)、idf(反转文档频率)、boost(Field的激励因子)和lengthNorm(长度因子)。
tf值的计算方法时某个关键字在某文档中出现次数的平方根。
在进行相关度排序的时候,如果想人为地增加某个文档的相关度,使其在搜索结果中排在更靠前的位置上,则可以使用boost。boost值是随着索引的建立而写入索引文档中的,因此,需要在建立索引时指定,也就是要在调用IndexWriter.addDocument为文档建立索引之前。
在Lucene中,文档的boost值一般情况下默认为1.0,但当某个文档的boost值大于1.0后,所有的文档的boost值都会除以这个最大值,以此来为每一个文档获取一个小于1.0的数作为新的boost值。这也就是为什么在建立索引时,为某个文档设定其boost值大于1,但在搜索得到它时,取出它的boost值却是一个不大于1的数。同样,当某个文档的得分大于1时,Lucene也会进行类似操作。事实上,通过explain方法可以计算出文档的得分要大于1,但是显示出来的结果却是1。
Lucene除了可以为Document设置boost值外,也可以为Field级别设置boost值。对Field的boost的值的改变将直接影响到Document的分值。
-
使用Sort来排序
Sort类位于org.apache.lucene.search包中。Sort所提供的排序功能是以Field为基础的,即最终的排序准则,总是以某个(或多个)Field的值为基础。
Sort的六个构造函数:
public Sort();
public Sort(String field);
public Sort(String field,booleanreverse);
public Sort(String[] fields);
public Sort(SortField field);
public Sort(SortField[] fields);
其中reverse参数可以指明是升序还是降序,默认值为false,即降序。
SortField实际上是一个包装类型,通过它的包装,可以使Sort类清楚地了解要进行排序的Field的各种信息。SortField的部分构造函数:
public SortField(String field)
public SortField(String field,boolean reverse)
public SortField(String field,int type)
public SortField(String field,int type,booleanreverse)
为了方便,SortField提供了几个常量来标识,比如SortField.STRING、SortField.INT、SortField.FLOAT。
Lucene在为每个Document建立索引的时候,Lucene回味每个文档建立一个内部的ID号。有时,会需要按照文档的内部ID号来对其进行排序。Sort类提供了直接的静态实例Sort.INDEXORDER表明当前的排序意图。但事实上,在真正的开发过程中,这种需求并不常见。
对于Sort对象来说,其内部留有一个SortField类型的数组,无论是直接以字符串方式向其提供Field信息,还是先将Field封装成SortField对象后提交给它,最终在Sort内部,所有Field都会转化成SortField的对象数组进行保存。
在Sort类的内部有多个重载的setSort方法,它们会将用户提交的String型的Field信息转成SortField的对象,并存放在内部的数组中,或是直接将用户提交的SortField数组作为内部数组,在排序时使用。
比较字符串时,Locate信息的不同,很有可能会影响比较的结果。
《开发自己的搜索引擎》读书笔记——排序
最新推荐文章于 2022-08-20 19:56:28 发布