Hello,World

elasticsearch自定义phash插件开发问题

Elasticsearch | 作者 comodo | 发布于2019年11月21日 | 阅读数:1920

关于图像相似度问题做一个搜索,模糊查询比较浪费es性能,所以想要自定义打分插件,完成图片相似度检测
文件HammingDistanceScriptFactory :
package com.pwnzen.elasticsearch.EsPlugin;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.script.ExecutableScript;
import org.elasticsearch.script.NativeScriptFactory;
import java.util.Map;
public class HammingDistanceScriptFactory implements NativeScriptFactory {
public ExecutableScript newScript(@Nullable Map<String, Object> params) {
return new HammingDistancePlugin(params);
}

public boolean needsScores() {
return true;
}

public String getName() {
return "haming-script";
}
}

打分类:
package com.pwnzen.elasticsearch.EsPlugin;
import org.elasticsearch.index.fielddata.ScriptDocValues;
import org.elasticsearch.common.Nullable;
import java.util.Map;
import org.elasticsearch.script.AbstractDoubleSearchScript;
import java.math.BigInteger;
public class HammingDistancePlugin extends AbstractDoubleSearchScript {
private String field;
private String hash;
private int length;
public HammingDistancePlugin(@Nullable Map<String, Object> params) {
super();
field = (String) params.get("param_field");
hash = (String) params.get("param_hash");
if (hash != null) {
length = hash.length() * 4;
}

}

private double hammingDistance(String lhs, String rhs) {
return (length - new BigInteger(lhs, 16).xor(new BigInteger(rhs, 16)).bitCount()) / (double) length * 100;
}

@Override
public double runAsDouble() {
String fieldValue = ((ScriptDocValues.Strings) doc().get(field)).getValue();
//Serious arse covering:
if (hash == null || fieldValue == null || fieldValue.length() != hash.length()) {
return 0.0;
}

return hammingDistance(fieldValue, hash);
}
}
完成插件安装,但是在启动时,es时es抛出错误
[WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.ClassCastException: class com.pwnzen.elasticsearch.EsPlugin.HammingDistancePlugin
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:123) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:70) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) ~[elasticsearch-5.6.16.jar:5.6.16]
Caused by: java.lang.ClassCastException: class com.pwnzen.elasticsearch.EsPlugin.HammingDistancePlugin
at java.lang.Class.asSubclass(Class.java:3404) ~[?:1.8.0_232]
at org.elasticsearch.plugins.PluginsService.loadPluginClass(PluginsService.java:418) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:390) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:141) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:313) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.16.jar:5.6.16]
... 6 more
已邀请:

要回复问题请先登录注册