在使用不管是 Lucene 或者 ElasticSearch 进行全文搜索中,检索到文档很简单,但是把搜索者最想要的结果排在最前面,这是最具挑战性的。
我们举个最简单的例子:假设我们需要做一个博客搜索,当我们用 Lucene 默认的匹配度进行排序,那你可能会发现搜索出来的都是一堆垃圾文章。所以一般我们会把博客文章的其他因素作为排序方法来替代匹配度。例如会考虑 “阅读数、文章长度、是否编辑推荐” 等诸多扩展因素综合进行排序。
这种时候我们一般会构造一个包含多个 SortField 的 Sort 对象,例如前面提到的阅读数、长度、是否推荐等。
但是!这个排序对象在搜索前就已经固定下来的,这样可能会出现一种情况,一些相关度非常低,但它的阅读数很高,同时又是编辑推荐的博客文章会排在前面。
有没有这样一种可能,我想根据不同的内容相关度,再结合文章的一些扩展指标来进行排序。比如,当我在搜博客的时候,只有当相关度大于某个值的时候,我会通过这些文章扩展指标来加分,让这些被推荐的文章排在前面。
这里就要用到 lucene 的 FunctionScoreQuery 来实现了,在老的版本里,是一个叫 CustomScoreQuery 的类,在新版已经被废弃了。 Lucene 的 API 就是这么变态,新版本发布经常都会有 API 的大变更。
大概的使用过程是这样的:
0. 需要引用的类
import org.apache.lucene.expressions.Expression;
import org.apache.lucene.expressions.SimpleBindings;
import org.apache.lu