简短的问题是:
我想在 Solr 4.3.0 索引上禁用存储字段压缩。看完后 :
http://blog.jpountz.net/post/35667727458/stored-fields-compression-in-lucene-4-1
http://wiki.apache.org/solr/SimpleTextCodecExample
http://www.opensourceconnections.com/2013/06/05/build-your-own-lucene-codec/
我决定按照那里描述的路径,制作我自己的编解码器。我很确定我已经完成了所有步骤,但是,当我真正尝试使用我的编解码器(亲切地命名为“UncompressedStorageCodec”)时,我在 Solr 日志中收到以下错误:
java.lang.IllegalArgumentException: A SPI class of type org.apache.lucene.codecs.PostingsFormat with name 'UncompressedStorageCodec' does not exist. You need to add the corresponding JAR file supporting this SPI to your classpath.
The current classpath supports the following names: [Pulsing41, SimpleText, Memory, BloomFilter, Direct, Lucene40, Lucene41]
at org.apache.lucene.util.NamedSPILoader.lookup(NamedSPILoader.java:109)
从输出中我得到 Solr 没有使用我的自定义编解码器拾取 jar,我不明白为什么?
这是所有可怕的细节:
我创建了一个这样的类:
public class UncompressedStorageCodec extends FilterCodec {
private final StoredFieldsFormat fieldsFormat = new Lucene40StoredFieldsFormat();
protected UncompressedStorageCodec() {
super("UncompressedStorageCodec", new Lucene42Codec());
}
@Override
public StoredFieldsFormat storedFieldsFormat() {
return fieldsFormat;
}
}
在包中:“fr.company.project.solr.transformers.utils”
“FilterCodec”的 FQDN 是:“org.apache.lucene.codecs.FilterCodec”
我已经创建了一个基本的 jar 文件(从 Eclipse 将其导出为 jar)。
我用来测试的 Solr 安装是基本的 Solr 4.3.0 解压缩,并通过它的嵌入式 Jetty 服务器和使用示例核心启动。
我已经将我的 jar 和编解码器放在 [solrDir]\dist
在:
[solrDir]\example\solr\myCore\conf\solrconfig.xml
我已经添加了这一行:
<lib dir="../../../dist/" regex="myJarWithCodec-1.10.1.jar" />
然后在 schema.xml 文件中,我声明了一些应该使用此编解码器的 fieldTypes,如下所示:
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" postingsFormat="UncompressedStorageCodec"/>
<fieldType name="string_lowercase" class="solr.TextField" positionIncrementGap="100" omitNorms="true" postingsFormat="UncompressedStorageCodec">
<!--...-->
</fieldType>
现在,如果我使用 DataImportHandler 组件将一些数据导入 Solr,在提交时它会告诉我:
java.lang.IllegalArgumentException: A SPI class of type org.apache.lucene.codecs.PostingsFormat with name 'UncompressedStorageCodec' does not exist. You need to add the corresponding JAR file supporting this SPI to your classpath.
The current classpath supports the following names: [Pulsing41, SimpleText, Memory, BloomFilter, Direct, Lucene40, Lucene41]
at org.apache.lucene.util.NamedSPILoader.lookup(NamedSPILoader.java:109)
我觉得奇怪的是,上面提到的编解码器 jar 还包含一些用于 DataImportHandler 组件的 Transformer。这些都很好。此外,放置在 dist 文件夹中的其他 jars(并在 solrconfig.xml 中以相同的方式声明),如 jdbc 驱动程序也可以正常提取。我猜对于编解码器,有这个 SPI thingy 可以加载不同的东西,并且他缺少一些东西......
我还尝试将编解码器 jar 放入:
[solrDir]\example\solr-webapp\webapp\WEB-INF\lib\
以及在 solr.war 文件的 WEB-INF\lib 文件夹中,该文件位于:
[solrDir]\example\webapps\
但我仍然遇到同样的错误。
所以基本上,我的问题是,Solr 拾取我的编解码器 jar 缺少什么?
谢谢