最近做新闻推荐系统,新闻搜索采用的是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. css:清楚html所有标签自带属性

    相信如果您动手写过网页的话,应该体会到有些标签会自带一些默认的样式,而这些样式或许又是我们不想要的,所以我们可以用以下代码清除所有标签的默认样式   html, body, div, span, ap ...

  2. txt,csv,json互相转化

    也没啥,记下来怕忘了.说明都在代码里面: 麻蛋,这个着色好难看 import csv import json #从txt变为csv student_txt=[]; with open("st ...

  3. 27.Hibernate-缓存和懒加载.md

    目录 1.一级缓存 2.缓存的有效性 3.list和iterator缓存的区别 4.懒加载 4.1get 4.2load 1.一级缓存 Hibernate中一级缓存是Session缓存,有效范围在Se ...

  4. web.xml hello1代码分析

    在“Web页”节点下,展开WEB-INF节点,然后双击web.xml文件进行查看. 上下文参数提供Web应用程序所需的配置信息.应用程序可以定义自己的上下文参数.此外,JavaServer Faces ...

  5. SpringJDBC中jdbcTemplate 的使用

    一:定义 SpringJDBC是spring官方提供的一个持久层框架,对JDBC进行了封装,提供了一个JDBCTemplated对象简化JDBC的开发.但Spring本身不是一个orm框架,与hibe ...

  6. Jmeter连接MySQL和SQL Server配置(转载)

    在使用jmeter做性能或自动化测试的时候,往往需要直接对数据库施加压力,或者某些参数只能从数据库获取,这时候就必须使用jmeter连接数据库. 2 下载对应的驱动包 mysql驱动: (mysql- ...

  7. Anaconda3(python3.5.2)中安装opencv3

    1 安装Visual C++2015 redistributable 我是64位和32的都安装了,如果你电脑中已经安装了17的,就先卸载了,不然安装不上. 2 安装依赖包Numpy.Scipy Num ...

  8. 看到blackarch 字体不错 记录下来

    terminus-font

  9. JavaScript资源网址

    JavaScript 全栈工程师培训教程 http://www.ruanyifeng.com/blog/2016/11/javascript.html

  10. 完全理解 Python 迭代对象、迭代器、生成器

    完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun    本文源自RQ作者 ...