搜索排序 - 基于ES自定义算分 有更新!

  |   1 评论   |   585 浏览

    全文检索框架,由最开始的Lucene到早期的solr,再到最近比较流行的elasticsearch(ES)。这些框架都为检索而生的,我们可以基于他们搭建自己的全文检索平台。在检索中,我们最关注的几个点有:召回和排序。召回,主要是涉及到数据的索引,而排序,就是我们对结果的打分了。
    ES本身会基于搜索词与文本之间的相似性,建立一套打分规则,一般我们称之为BM25算分,这个是基于文本之间的相似性进行的打分,但是在我们自己建立的数据中,有可能涉及到其他的属性,比如商品,可能涉及到销售量,又比如应用app,涉及到下载量。我们希望将这些指标加入到评分中,这时候,我们就需要建立自己的评分规则了。ES本身是支持我们自定义评分规则的。比如下面的查询语句:

    20190319224638png

    我们重点关注functions里边的内容,这里涉及到的就是我们自定义的算分方式,比如script_score节点中的inline,则是我们的自定义公式,其中_score是ES原始的
    的计算得分结果。在最外层,内容在function_score下。参考ES官方

    JavaAPI的实现方式如下:

    SearchRequestBuilder builder = client.prepareSearch(index).setTypes(type);
    ScriptScoreFunctionBuilder scoreFunction = ScoreFunctionBuilders.scriptFunction(“_score + “+ SearchConstants.getEsWeight() +” *Math.log(doc[‘dn’].value + 1)”);
    BoolQueryBuilder query = QueryBuilders.boolQuery();
    FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(query,scoreFunction);
    builder.setQuery(functionScoreQueryBuilder);

    评论

    发表评论

    validate