我想利用脚本来使用自定义逻辑对elasticsearch中的结果进行排序。我已阅读弹性搜索中的文档但无法弥补。在互联网上看到一些链接后,我尝试了一下,下面是相同的源代码。我正在使用本机(Java)。我不确定这是否是正确的方法。
import org.elasticsearch.script.ExecutableScript;
import org.elasticsearch.script.NativeScriptFactory;
import customSortProject.Sorted;
import java.util.Map;
public class CustomScriptFactory implements NativeScriptFactory {
public ExecutableScript newScript(Map<String, Object> params) {
return new Sorted(params);
}
}
我正在实施疼痛逻辑的课程。目前我只是得到了未来的日期。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.script.AbstractSearchScript;
public class Sorted extends AbstractSearchScript {
String fieldParam;
int lengthParam;
public Sorted(@Nullable Map<String,Object> params){
fieldParam = (String)params.get("field");
lengthParam = new Integer(params.get("length").toString()).intValue();
}
public Object run() {
if(source().containsKey(fieldParam) && source().get(fieldParam)!= null && source().get(fieldParam).toString() != null) {
String field = doc().get(fieldParam).toString();
field = field.replaceAll("\\[", "").replaceAll("\\]","");
long fieldLong = 0;
Date today = new Date();
fieldLong = Long.parseLong(field);
Date date = new Date(fieldLong);
List<Date> futureList = new ArrayList<Date>();
if (date.after(today))
futureList.add(date);
Collections.sort(futureList);
return futureList;
}
else {
return "";
}
}
}
使用这个逻辑并使用query_dsl,我试图调用这个在.yml文件中注册的脚本。
查询:
{
"query": {
"match": {
"title": "cancer"
}
},
"sort": {
"_script": {
"script": "sorted",
"lang": "native",
"type": "string",
"ignore_unmapped": true,
"params": {
"field": "startdate",
"length": 6
}
}
}
}
请告诉我这是自定义排序的正确方法。我想从查询dsl中调用它,因为我们的应用程序是在PHP中,我们使用PHP的es-client进行搜索。