基于Elasticsearch的自定义评分算法扩展 (转)

实现思路:

重写评分方法,调整计算文档得分的过程,然后根据function_score或script_sort进行排序检索。

实现步骤:

1、新建java项目TestProject,引入Elasticsearch的jar包

2、新建package:es.testscript

3、新建类TestScriptFactory,继承NativeScriptFactory,示例:

package es.testscript;

import java.util.Map;

import org.elasticsearch.common.Nullable;

import org.elasticsearch.script.ExecutableScript;

import org.elasticsearch.script.NativeScriptFactory;

/**

* Created by lijunhao on 2016/3/29.

*/

public class TestScriptFactory implements NativeScriptFactory {

@Override

public ExecutableScript newScript(@Nullable Map<String, Object> params) {

return new TestScript(params);

}

}

4、新建类TestScript,假设计算double类型的得分,继承AbstractDoubleSearchScript,并重写runAsDouble方法,示例:

package es.testscript;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import org.elasticsearch.common.Nullable;

import org.elasticsearch.index.fielddata.ScriptDocValues;

import org.elasticsearch.script.AbstractDoubleSearchScript;

import org.elasticsearch.script.AbstractLongSearchScript;

import java.util.Map;

public class TestScript extends AbstractDoubleSearchScript {

//客户端传递的参与动态计算得分的参数

private String[] paramArray;

/**

* 构造函数 获取传入的参数

*

* @param params

*/

public TestScript(@Nullable Map<String, Object> params) {

if (params == null || params.size() == 0) {

return;

}

Set<String> keys = params.keySet();

Iterator<String> iterator = keys.iterator();

while (iterator.hasNext()) {

String key = iterator.next();

String val = params.get(key).toString();

System.out.println("key:" + key + " val:" + val + "\r\n");

}

if (params.get("fields") == null) {

return;

}

paramArray = params.get("fields").toString().split(",");

System.out.println("fields:" + params.get("fields").toString() + "\r\n");

}

/**

* 排序方法,计算得分

*

* @return

*/

@Override

public double runAsDouble() {

double defaultReturnVal = Double.parseDouble(String.valueOf(((ScriptDocValues.Longs)doc().get("id")).getValue()));

if (paramArray == null || paramArray.length == 0) {

return defaultReturnVal;

}

//根据传入的paramArray计算得分

defaultReturnVal=defaultReturnVal+1000;

System.out.println("score:" + defaultReturnVal + "\r\n");

return defaultReturnVal;

}

}

5、打包输出jar文件TestProject.jar

6、将TestProject.jar拷贝至ES目录的lib下

7、修改ES配置文件elasticsearch.yml,添加:

script.native:

mynativescript.type: es.testscript.TestScriptFactory

注:mynativescript为自定义的脚本别名。

8、重启ES服务

9、执行检索:function_score方式

{

"query": {

"function_score": {

"query": {

"match_all": {}

},

"functions": [

{

"script_score": {

"script": "mynativescript",

"lang": "native",

"params": {

"p1": 1,

"fields": "p1,p2"

}

}

}

]

}

}

}

10、执行检索:script_sort方式

{

"query": {

"match_all": {}

},

"sort": {

"_script": {

"script": "mynativescript",

"lang": "native",

"order": "asc",

"type": "string",

"params": {

"p1": 1,

"p2": 2,

"p3": 3

}

}

}

}

11、执行检索:Nest方式之Linq

var s = new SearchDescriptor<ModelTest>().From(0).Size(20).MatchAll().SortScript(sort => sort

.Descending()

.Script("mynativescript")

.Descending()

.Params(p => p

.Add("p1", 1.1).Add("p2", 2.2)

)

.Language("native")

.Type("string")

);

//获取请求的json字符串

string reqStr = Encoding.UTF8.GetString(client.Serializer.Serialize(s));

ISearchResponse<ModelTest> resp = client.Search<ModelTest>(s);

ModelTest[] result = resp.Documents.ToArray();

12. Nest方式之Query对象

 1 QueryContainer mainQuery = null; <br> FunctionScoreQuery funcQuery = new FunctionScoreQuery();
 2 funcQuery.ScoreMode = FunctionScoreMode.Sum;
 3 funcQuery.BoostMode = FunctionBoostMode.Replace;
 4 funcQuery.MaxBoost = 1000.0f;
 5 IFunctionScoreFunction func = new FunctionScoreFunctionsDescriptor<DTOCarInfoIndexField>().ScriptScore(s => s.Lang("native").Script("mynativescript"));
 6 IList<IFunctionScoreFunction> list = new List<IFunctionScoreFunction>();
 7 list.Add(func);
 8 funcQuery.Functions = list;
 9 mainQuery &= funcQuery;
10
11   
时间: 2024-10-13 16:05:38

基于Elasticsearch的自定义评分算法扩展 (转)的相关文章

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

实现思路: 重写评分方法,调整计算文档得分的过程,然后根据function_score或script_sort进行排序检索. 实现步骤: 1.新建java项目TestProject,引入Elasticsearch的jar包 2.新建package:es.testscript 3.新建类TestScriptFactory,继承NativeScriptFactory,示例: package es.testscript; import java.util.Map; import org.elastic

Elasticsearch系列---相关性评分算法及正排索引

概要 上一篇中多次提到了按相关性评分,本篇我们就来简单了解一下相关性评分的算法,以及正排索引排序的优势. 评分算法 Elasticsearch进行全文搜索时,Boolean Model是匹配的基础,先用boolean model将匹配的文档挑选出来,然后再运用评分函数计算相关度,参与的函数如我们提到的TF/IDF.Length Norm等,再加上一些控制权重的参数设置,得到最后的评分. Boolean Model 作为全文搜索的基础,Boolean Model的结果决定文档是否要进行下一步的评分

基于elasticsearch的自定义业务告警的设计思路

A系统与B系统之间有很多接口交互,但是有一段时间接口经常报错,作为开发如果不能第一时间知道问题且及时解决的话就会收到业务投诉,当月绩效凉凉. 如果你也有这种场景,那么你就需要一个及时告警的功能. 实现方案 实现及时告警分以下两种场景: 有ELK日志收集 没有ELK日志收集 没有ELK日志收集的方案 ~~很简单,搭建一个日志收集环境(O(∩_∩)O哈哈~)~~ 需要在业务代码中嵌入硬编码,每次catch到异常直接发送告警信息告警平台进行告警 有ELK日志收集的方案 最核心的是 elasticsea

lucene自定义评分

要实现自定义评分,想把我们认为应该排在前面成为top,lucenen给我们留了一个扩展类就是CustomScoreQuery 首先.我们创建评分的时候要先定义一个我们自己要改变的评分域 FieldScoreQuery fieldScoreQuery=new FieldScoreQuery("score", Type.INT);//设置评分域为socre 然后indexSearch.search中要传入一个CustomScoreQuery,要覆盖getCustomScoreProvide

基于用户的协同过滤算法(UserCF)

基于用户的协同过滤算法: 找到和目标用户相似的用户集合 找到这个集合中用户喜欢的但目标用户没有听过的物品 #encoding: utf-8 from Similarity import Person from Sort import select_sort file=open('user_bookmark','r') filew=open('user_bookRecommend','w') #加载训练集 trainSet={} while True: line=file.readline().s

中文分词算法 之 基于词典的全切分算法

在使用 基于词典 的分词方法的时候,如果我们解决了下面4个问题: 1.如何把一句话中所有的词找出来呢?只要词典中有就一定要找出来. 2.如何利用1中找出来的词组合成完整的句子?组合成的句子要和原句一样. 3.如何保证2中组合而成的句子包含了所有可能的词序? 4.如何从所有可能的词序中选择最完美的一种作为最终的分词结果? 那么我们的分词方法称之为:基于词典的全切分算法. 下面我们以一个实例来说明,比如句子:中华人民共和国. 假设词典中包含如下词: 中华人民共和国 中华人民 中华 华人 人民共和国

mahout demo——本质上是基于Hadoop的分步式算法实现,比如多节点的数据合并,数据排序,网路通信的效率,节点宕机重算,数据分步式存储

摘自:http://blog.fens.me/mahout-recommendation-api/ 测试程序:RecommenderTest.java 测试数据集:item.csv 1,101,5.0 1,102,3.0 1,103,2.5 2,101,2.0 2,102,2.5 2,103,5.0 2,104,2.0 3,101,2.5 3,104,4.0 3,105,4.5 测试程序:org.conan.mymahout.recommendation.job.RecommenderTest.

[AngularJS/Elasticsearch] 使用AngularJS为基于Elasticsearch的应用创建前端

使用AngularJS为基于Elasticsearch的应用创建前端 如果使用Elasticsearch使用应用的数据源,我们可以很方便的使用AngularJS结合Elasticsearch提供的相关模块为它创建一个前端. 以创建一个简单的员工信息花名册为例. 准备工作 准备工作分为以下两个方面: 添加前端依赖 安装Bower 在bower.json中添加对于AngularJS和Elasticsearch的依赖: "dependencies": { "angular"

Lucene3.5自定义评分以及根据域进行自定义评分设定

一.首先来综述一下Lucene自定义评分的步骤: 1.创建一个评分域 FieldScoreQuery fd = new FieldScoreQuery("score", Type.INT); 2.根据评分域和原有的query创建自定义的query对象 MyCustomScoreQuery query = new MyCustomScoreQuery(q, fd); @SuppressWarnings("serial") private class MyCustomS