尝试在solr中应用自定义过滤器时发生ClassCastException [英] ClassCastException when trying to apply custom filter in solr

查看:101
本文介绍了尝试在solr中应用自定义过滤器时发生ClassCastException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用4.10.3 solr,并在使用Filter实现Factory后

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.util.TokenFilterFactory;

import java.util.Map;

public class CustomFilterFactory extends TokenFilterFactory {

protected CustomFilterFactory(Map<String, String> args) {
    super(args);
}

@Override
public TokenStream create(TokenStream tokenStream) {
    return new CustomFilter(tokenStream);
}
}  

当Solr启动时,我在日志中收到奇怪的错误:

Caused by: 
java.lang.ClassCastException: class org.apache.lucene.analysis.tr.ApostropheFilterFactory
at java.lang.Class.asSubclass(Class.java:3116)
at org.apache.lucene.util.SPIClassIterator.next(SPIClassIterator.java:141)
at org.apache.lucene.analysis.util.AnalysisSPILoader.reload(AnalysisSPILoader.java:79)
at org.apache.lucene.analysis.util.AnalysisSPILoader.<init>(AnalysisSPILoader.java:60)
at org.apache.lucene.analysis.util.AnalysisSPILoader.<init>(AnalysisSPILoader.java:49)
at org.apache.lucene.analysis.util.TokenFilterFactory.<clinit>(TokenFilterFactory.java:31)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at org.apache.solr.core.SolrResourceLoader.findClass(SolrResourceLoader.java:474)
at org.apache.solr.core.SolrResourceLoader.newInstance(SolrResourceLoader.java:593)
at org.apache.solr.schema.FieldTypePluginLoader$1.create(FieldTypePluginLoader.java:306)
at org.apache.solr.schema.FieldTypePluginLoader$1.create(FieldTypePluginLoader.java:299)
at org.apache.solr.util.plugin.AbstractPluginLoader.load(AbstractPluginLoader.java:151)
at org.apache.solr.schema.FieldTypePluginLoader.readAnalyzer(FieldTypePluginLoader.java:325)
at org.apache.solr.schema.FieldTypePluginLoader.create(FieldTypePluginLoader.java:95)
at org.apache.solr.schema.FieldTypePluginLoader.create(FieldTypePluginLoader.java:43)
at org.apache.solr.util.plugin.AbstractPluginLoader.load(AbstractPluginLoader.java:151)
at org.apache.solr.schema.IndexSchema.readSchema(IndexSchema.java:486)

有什么想法会导致这种状态吗?

字段定义:

<field name="ii" type="customFilter" indexed="true" stored="false"  required="false" multiValued="false"/>
<fieldType name="customFilter" class="solr.TextField">
    <analyzer>
        <charFilter class="com.nosql.search.solr.CustomFilterFactory" /> 
    </analyzer> 
</fieldType>

我正在使用具有过滤器的自定义jar和用于启动Solr的相同Java版本.

如果删除对CustomFilterFactory的引用,它将起作用.

解决方案

我在Solr 6.4中遇到了同样的问题.但是我的Solr部署在Hybris 6框架中.关键是我试图将我的自定义令牌过滤器库直接添加到solr服务器库$ {solr_instance}/server/lib中,然后我得到一个例外,即引擎可以找到父级Lucene类TokenFilterFactory.在添加了相关的jar lucene-analysers-common-x,lucene-core-x之后,我得到了与您相同的错误(java.lang.ClassCastException:类org.apache.lucene.analysis.tr.ApostropheFilterFactory)

要解决此问题,我将我的自定义jar移到了自定义文件夹$ {solr_instance}/contrib/hybris/lib,没有任何其他Lucene库.而且,我的solrconfig.xml已经有一个链接:

<lib dir="${solr.install.dir:../../../..}/contrib/hybris/lib" regex=".*\.jar" />

因此,可以得出结论,这种异常是指类路径歧义性问题,这使Solr感到困惑.

I'm using 4.10.3 solr and after I implemented Factory with Filter

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.util.TokenFilterFactory;

import java.util.Map;

public class CustomFilterFactory extends TokenFilterFactory {

protected CustomFilterFactory(Map<String, String> args) {
    super(args);
}

@Override
public TokenStream create(TokenStream tokenStream) {
    return new CustomFilter(tokenStream);
}
}  

and when Solr starts, I'm getting strange errors in log:

Caused by: 
java.lang.ClassCastException: class org.apache.lucene.analysis.tr.ApostropheFilterFactory
at java.lang.Class.asSubclass(Class.java:3116)
at org.apache.lucene.util.SPIClassIterator.next(SPIClassIterator.java:141)
at org.apache.lucene.analysis.util.AnalysisSPILoader.reload(AnalysisSPILoader.java:79)
at org.apache.lucene.analysis.util.AnalysisSPILoader.<init>(AnalysisSPILoader.java:60)
at org.apache.lucene.analysis.util.AnalysisSPILoader.<init>(AnalysisSPILoader.java:49)
at org.apache.lucene.analysis.util.TokenFilterFactory.<clinit>(TokenFilterFactory.java:31)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at org.apache.solr.core.SolrResourceLoader.findClass(SolrResourceLoader.java:474)
at org.apache.solr.core.SolrResourceLoader.newInstance(SolrResourceLoader.java:593)
at org.apache.solr.schema.FieldTypePluginLoader$1.create(FieldTypePluginLoader.java:306)
at org.apache.solr.schema.FieldTypePluginLoader$1.create(FieldTypePluginLoader.java:299)
at org.apache.solr.util.plugin.AbstractPluginLoader.load(AbstractPluginLoader.java:151)
at org.apache.solr.schema.FieldTypePluginLoader.readAnalyzer(FieldTypePluginLoader.java:325)
at org.apache.solr.schema.FieldTypePluginLoader.create(FieldTypePluginLoader.java:95)
at org.apache.solr.schema.FieldTypePluginLoader.create(FieldTypePluginLoader.java:43)
at org.apache.solr.util.plugin.AbstractPluginLoader.load(AbstractPluginLoader.java:151)
at org.apache.solr.schema.IndexSchema.readSchema(IndexSchema.java:486)

Any idea what could cause this state?

Field definition:

<field name="ii" type="customFilter" indexed="true" stored="false"  required="false" multiValued="false"/>
<fieldType name="customFilter" class="solr.TextField">
    <analyzer>
        <charFilter class="com.nosql.search.solr.CustomFilterFactory" /> 
    </analyzer> 
</fieldType>

I'm using same Java version for my custom jar with filter and for starting Solr.

It works if I remove the reference to CustomFilterFactory.

解决方案

I had the same issue with Solr 6.4. But my solr is deployed within the Hybris 6 framework. The point is that I tried to add my custom token filter library directly to solr server libraries ${solr_instance}/server/lib, then I got an exception that the engine could find the parent lucene class TokenFilterFactory. After the adding of the related jars lucene-analysers-common-x, lucene-core-x, I got the same error as yours (java.lang.ClassCastException: class org.apache.lucene.analysis.tr.ApostropheFilterFactory)

To resolve this I just moved my custom jar to the custom folder ${solr_instance}/contrib/hybris/lib without any additional lucene libs. Moreover my solrconfig.xml already had a link to it:

<lib dir="${solr.install.dir:../../../..}/contrib/hybris/lib" regex=".*\.jar" />

So, one can conclude that this kind of exception refers to classpath ambiguity issue, which confuses Solr.

这篇关于尝试在solr中应用自定义过滤器时发生ClassCastException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆