使用Elasticsearch

时间:2015-12-10 10:29:10

标签: elasticsearch

我想利用脚本来使用自定义逻辑对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进行搜索。

0 个答案:

没有答案