最近做新闻推荐系统,新闻搜索采用的是elasticsearch引擎,为了使推荐更接近用户偏好,搜索时使用了function_score功能对文档进行了重新打分,改变排序规则。以下介绍关于function score的一些用法。

The function_score allows you to modify the score of documents that are retrieved by a query. This can be useful if, for example, a score function is computationally expensive and it is sufficient to compute the score on a filtered set of documents.(这个是官方对function_score的解释)

es内置了几种预先定义好了的函数:

1、weight:对每份文档适用一个简单的提升,且该提升不会被归约:当weight为2时,结果为2 * _score。

2、field_value_factor:使用文档中某个字段的值来改变_score,比如将受欢迎程度或者投票数量考虑在内。

3、random_score:使用一致性随机分值计算来对每个用户采用不同的结果排序方式,对相同用户仍然使用相同的排序方式。

4、Decay Functions:衰减函数,衰减函数是利用从给定的原点到某个用户数字类型字段的值的距离的衰减进行打分的。这类似于一个范围查询,而且边缘是光滑的。

es内部支持的衰减函数有gauss(高斯)、exp(指数)、linear(线性)

5、 script_score:使用自定义的脚本来完全控制分值计算逻辑。

推荐系统中有很多个性化的feature权重,所以我们主要采用script_score来对文档打分。下面主要说一下script_score的使用。

(1)、在es配置中配置脚本功能,配置后重启服务

script.inline: on

script.enfine.groovy.inline.aggs: on

script.indexed: on

script.file: on

(2)、测试查询语句,例:

{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "title": "航母"
              }
            }
          ]
        }
      },
      "score_mode": "first",
      "script_score": {
        "lang": "groovy",
        "params": {
          "timestamp": 1460768418541
        },
        "script": "(_score+ 1/(timestamp-doc['timestamp'].value.toDouble()+1))/2"
      },
      "boost_mode": "replace"
    }
  }
}     
  查询结果中可以看到每条文档数据的分值  例:"_score": 0.5103256,

(3)、java查询代码  queryBuilder:
Map<String,Object> params = new HashMap<String,Object>();
params.put("timestamp",1460768428541L);
FunctionScoreQueryBuilder query =
QueryBuilders.functionScoreQuery(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("title", "航母"))
).add(ScoreFunctionBuilders.scriptFunction(
new Script("(_score + 1/(timestamp-doc['timestamp'].value.toDouble()+1))/2"
,ScriptType.INLINE,"groovy",params))
).scoreMode("first")
.boostMode(CombineFunction.REPLACE);

"script_score": {
        "lang": "groovy",
        "params": {
          "timestamp": 1460768418541
        },
        "script": "(_score+ 1/(timestamp-doc['timestamp'].value.toDouble()+1))/2"
      },
     以上这部分就是脚本函数打分的一个实现。lang表示选用的脚本语言,这里我们选用groovy(es配置,默认groovy);params是脚本函数需要的参数;script是函数语句(参照groovy语法)

关于elasticsearch function_score的使用的更多相关文章

  1. elasticsearch function_score Query——文档排序结果的最后一道墙

    function_score Query The function_score query is the ultimate tool for taking control of the scoring ...

  2. Elasticsearch(7) --- 复合查询

    Elasticsearch(7) ---复合查询 复合查询有:bool query(布尔查询).boosting query(提高查询).constant_score(固定分数查询).dis_max( ...

  3. Elasticsearch:使用function_score及soft_score定制搜索结果的分数

    我们将介绍使用function_score的基础知识,并介绍一些function core技术非常有用和有效的用例. 介绍 评分的概念是任何搜索引擎(包括Elasticsearch)的核心.评分可以粗 ...

  4. Elasticsearch笔记

    资料 官网: http://www.elasticsearch.org 中文资料:http://www.learnes.net/ .Net驱动: http://nest.azurewebsites.n ...

  5. 用 Mahout 和 Elasticsearch 实现推荐系统

    原文地址 本文内容 软件 步骤 控制相关性 总结 参考资料 本文介绍如何用带 Apache Mahout 的 MapR Sandbox for Hadoop 和 Elasticsearch 搭建推荐引 ...

  6. 基于Elasticsearch的自定义评分算法扩展

    实现思路: 重写评分方法,调整计算文档得分的过程,然后根据function_score或script_sort进行排序检索.   实现步骤: 1.新建java项目TestProject,引入Elast ...

  7. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

  8. ElasticSearch快速指南

    ElasticSearch是基于Apache Lucene的分布式搜索引擎, 提供面向文档的搜索服务. 安装ElasticSearch 文档 创建文档 访问文档 更新文档 删除文档 索引 分析器 类型 ...

  9. ElasticSearch之 控制相关度原理讲解

    控制相关度 相关度评分背后的理论 如何计算评分的 Lucene 使用布尔模型(Boolean model) 查找匹配文档 并主要的借鉴了 词频/逆向文档频率(term frequency/invers ...

随机推荐

  1. java学习--面向对象

    对象及类的概念 对象是java程序的核心,在java程序中“万事万物皆对象” 对象可以看成是属性和方法的封装体 类是用来创建同一类型的对象的模板,在一个类中定义了该类对象所应具有的属性和方法 J2SD ...

  2. VMware虚拟机配置嵌套虚拟化

    VMware虚拟机下创建kvm-sever,server下继续创建kvm虚拟机(嵌套虚拟化),返回libvirt错误解决办法:SSH连接VMwarevi /etc/vmware/config增加一行设 ...

  3. vue 初始化data中的数据

    Object.assign(this.$data, this.$options.data());

  4. MYSQL分组合并函数

    MySQL中group_concat函数完整的语法如下:group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符' ...

  5. EnterpriseLibrary

    收藏一下: http://www.cnblogs.com/huangcong/archive/2010/06/01/1748672.html

  6. 外网访问Vmware虚拟机中的某个服务(如http)

    如果主机是windowx NAT中隐藏的端口映射,说明一下环境,利用当然是VMnet8网络连接,在虚拟机中架设linux WEB服务器利用WEB默认80端口,IP为192.168.11.10,真实主机 ...

  7. CO-产地证--需要的国家以及操作流程。

    需要产地证的国家一般是与中国有合作的亚非拉国家,比如: 巴基斯坦.智利.以色列.韩国.土耳其.越南.澳大利亚. 流程: 1.在海关官网上填报信息. 2.提交,客户在他国家的官网上确认. 3.确认无误后 ...

  8. 【你的职业规划】web前端的职业发展方向及学习攻略【转载】

    web前端的职业发展方向有哪些?本文献给正在迷茫中,准备入坑web前端的初学者以及知海匠库web前端培训班的准前端工程师们:   一.职业方向定位 首先,只有确定好自己的职业方向,才能做好职业规划.在 ...

  9. [leetcode]339. Nested List Weight Sum嵌套列表加权和

    Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...

  10. [leetcode]297. Serialize and Deserialize Binary Tree 序列化与反序列化二叉树

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...