最近做新闻推荐系统,新闻搜索采用的是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. <转> plsql dev中Dynamic Performance Tables not accessible分析解决

    相信很多使用plsql dev的朋友多遇到过类此如下面的提示: Dynamic Performance Tables not accessible, Automatic Statistics Disa ...

  2. ucore-lab1-练习5report

    实验5--实现函数调用堆栈跟踪函数 需要完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址. 一.函数堆栈 ...

  3. yum安装命令:遇到的问题报错如下: File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: 通过看报错可以了解到是使用了python2的语法,所以了解到当前yum使用的Python2,因为我单独安装了python3,且python3设置为默认版本了,所以导致语法问题 解决方法: 使用python2.6 yum install

    1.安装zip yum install -y unzip zip 2.安装lrszs yum -y install lrzsz 3.安装scp 遇到下面的问题: 结果提示: No package sc ...

  4. [leetcode]47. Permutations全排列(给定序列有重复元素)

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  5. 图片识别文字, OCR

    文章引用自: https://www.cnblogs.com/stone_w/archive/2011/10/08/2202397.html 方式一.Asprise-OCR的使用. Asprise-O ...

  6. springboot 使用JPA自动生成Entity实体类的方法

    1. 2. 3.添加数据库 4. 5. 6. 7.点击OK完成. 8.去掉红色波浪线方法. 9.配置数据源 完成!

  7. python爬虫之urllib

    #coding=utf-8 #urllib操作类 import time import urllib.request import urllib.parse from urllib.error imp ...

  8. TUN/TAP编程实现

    其实关于这两种设备的编程,基本上属于八股文,大家一般都这么干. 启动设备之前 有的linux 并没有将tun 模块编译到内核之中,所以,我们要做的第一件事情就是检查我们的系统是否支持 TUN/TAP ...

  9. ramfs的两种制作方法

    制作方法1 1  准备一个已经可以使用的文件系统,假设目录为/rootfsLinux内核需要支持ext2文件系统及ramdisk支持(fs相应的选项要勾上)2 在pc上制作ramdisk镜像(1)dd ...

  10. centos 7安装java开发环境

    https://jingyan.baidu.com/article/29697b91660672ab20de3c15.html 自带版本是有问题的~