如何在弹性搜索中使用本机脚本

时间:2014-11-22 07:24:07

标签: java elasticsearch

我按照步骤 - 1.创建了一个实现NativeScriptFactory的类。 2.创建了一个扩展AbstractSearchScript的类。

示例:

1

public class ExceptOperationScriptFactory implements NativeScriptFactory {
    public ExecutableScript newScript(Map<String, Object> params) {
        return new ExceptOperationScript(params);
    }
}

2

public class ExceptOperationScript extends AbstractSearchScript {
     private static int counter = 0;
     @SuppressWarnings("unchecked")
     public ExceptOperationScript(Map<String, Object> params) {
         System.out.println(new Date()+ " -- Inside Constructor --  " + counter++);
     }
     public Object run() {
          System.out.println(new Date()+ " -- Inside run --  " + counter++);
          if (StringUtils.isNotBlank(field)) {
               Object value = null;
               if (source() != null)
                    value = source().get(field);
               else if (doc() != null)
                    value = doc().get(field);

               if (value != null)
                    System.out.println("BEFORE check value of Current document field's value :: " + value + "--"+ new Date());

          }
          return null;
     }
}

控制台上的输出 -

Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor --  0
Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor --  1
Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor --  2
Fri Nov 21 23:09:12 PST 2014 -- Inside run --  3
Fri Nov 21 23:09:12 PST 2014 -- Inside run --  4
Fri Nov 21 23:09:12 PST 2014 -- Inside run --  5
Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor --  6
Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor --  7
Fri Nov 21 23:09:12 PST 2014 -- Inside run --  8

我无法在这里跟踪流程。为什么有随机的通话流? 根据我的调用顺序应该是Inside构造函数然后在Inside运行。

如何解决这个问题?我应该使方法和构造函数同步吗?

1 个答案:

答案 0 :(得分:0)

你可能在这里遇到了一些线程,即Elasticsearch会将搜索扩展到多个线程,以便在单个节点上使用多个CPU核心。因此,脚本在多个线程中并行多次实例化,并且根据CPU调度,脚本的某些实例已经开始运行,而其他实例仍然构建。

tl; dr:由于你有多个线程,因此当并行启动时,执行顺序是不确定的。