Solr使用自定义过滤器找不到BaseTokenFilterFactory

时间:2011-10-19 21:48:50

标签: java lucene solr sunspot

我正在尝试为Solr编写和使用自定义过滤器。父应用程序是使用Sunspot gem的Rails应用程序。

我在myorg/solr/analysis/TestThingFilterFactory.java中有一个过滤器工厂:

package myorg.solr.analysis;

import org.apache.lucene.analysis.TokenStream;
import org.apache.solr.analysis.BaseTokenFilterFactory;
import myorg.solr.analysis.TestThingFilter;

public class TestThingFilterFactory extends BaseTokenFilterFactory {
  public TestThingFilter create(TokenStream input) {
    return new TestThingFilter(input);
  }
}

以及myorg/solr/analysis/TestThingFilter.java中的过滤器:

package myorg.solr.analysis;

import java.io.IOException;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;

public class TestThingFilter extends TokenFilter {
  public TestThingFilter(TokenStream input) {
    super(input);
  }

  public boolean incrementToken() throws IOException {
    // ...
  }
}

我使用javac -classpath apache-solr-core-3.2.0.jar:lucene-core-3.2.0.jar myorg/solr/analysis/*.java编译了这些文件,然后从.jar文件中创建了一个.class文件,并将.jar文件放在了Sunspot的solr/lib/目录中。我修改了Solr的schema.xml以包含新的过滤器:

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.ASCIIFoldingFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="myorg.solr.analysis.TestThingFilterFactory"/>
  </analyzer>
</fieldType>

重新启动Solr并尝试重新索引会在日志中生成此错误:

SEVERE: java.lang.NoClassDefFoundError: org/apache/solr/analysis/BaseTokenFilterFactory
...
Caused by: java.lang.ClassNotFoundException: org.apache.solr.analysis.BaseTokenFilterFactory
...

这是我编译新过滤器代码的问题,对吧?我如何编译,以便它可以在运行时找到合适的类?

2 个答案:

答案 0 :(得分:1)

找到解决方案:包含自定义分析代码的新.jar文件应该放在Rails根目录中的solr/lib/目录中,而不是在销售的Sunspot gem中。这是包含solr/目录的conf/目录。

答案 1 :(得分:0)

根据这篇关于创建Solr Analysis Filter的帖子,您还需要在类路径中包含lucene-core-3.2.0.jar文件。我相信这是定义类BaseTokenFilterFactory的地方。

如果需要,我找到了lucene-core jar文件here ...