java phash,elasticsearch自定义phash插件开发问题

关于图像相似度问题做一个搜索,模糊查询比较浪费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 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 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.(PluginsService.java:141) ~[elasticsearch-5.6.16.jar:5.6.16]

at org.elasticsearch.node.Node.(Node.java:313) ~[elasticsearch-5.6.16.jar:5.6.16]

at org.elasticsearch.node.Node.(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]

at org.elasticsearch.bootstrap.Bootstrap$5.(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值