首页 技术 正文
技术 2022年11月12日
0 收藏 404 点赞 4,646 浏览 3777 个字

实现思路:重写评分方法,调整计算文档得分的过程,然后根据function_score或script_sort进行排序检索。 实现步骤:1、新建java项目TestProject,引入Elasticsearch的jar包2、新建package:es.testscript3、新建类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.jar6、将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方式之Linqvar 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对象

 QueryContainer mainQuery = null; 
FunctionScoreQuery funcQuery = new FunctionScoreQuery();
funcQuery.ScoreMode = FunctionScoreMode.Sum;
funcQuery.BoostMode = FunctionBoostMode.Replace;
funcQuery.MaxBoost = 1000.0f;
IFunctionScoreFunction func = new FunctionScoreFunctionsDescriptor<DTOCarInfoIndexField>().ScriptScore(s => s.Lang("native").Script("mynativescript"));
IList<IFunctionScoreFunction> list = new List<IFunctionScoreFunction>();
list.Add(func);
funcQuery.Functions = list;
mainQuery &= funcQuery;

  

 

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,086
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,561
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,411
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,184
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,820
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,904