我正在尝试升级我的自定义类以支持SOLR 4.3.0(来自SOLR 3.5.0),因此我尝试更新我的测试类以测试更改。
我知道我们需要在SOLR 4.3.0中使用键值对映射调用TokenFilterFactory构造函数,如下所示,
public class CustomFilterFactory extends TokenFilterFactory {
protected CustomFilterFactory(Map<String, String> args) {
super(args);
}
...
}
我对需要作为键值对传递的值感到困惑。例如:
如果我有一个字段名称作为位置和一个名为com.solr.analysis.CustomFilterFactory的自定义类,我应该将哪些作为键和值传递?
<fieldtype name="Location" class="solr.TextField" positionIncrementGap="100" stored="false" multiValued="true">
<filter class="com.solr.analysis.CustomFilterFactory" />
</fieldtype>
如果我不打算将任何其他参数传递给此类,我可以执行以下操作吗?
args.put(new HashMap());
CustomFilterFactory(args);
非常感谢你的帮助!
答案 0 :(得分:1)
我刚将空地图传递给CustomFilterFactory方法,一切都运行得很好。
Map<String,String> args = new HashMap<String, String>();
CustomFilterFactory factory = new CustomFilterFactory(args);
答案 1 :(得分:1)
不是解决方案,而是解决方法。您可以选择配置自定义分析器。我查看了RemoveDuplicateTokenFilter源代码,并且示例配置尝试复制MyCustomFilter和MyCustomFilterFactory,但它不起作用。具体来说,SolrResourceLoader一直抱怨我的自定义令牌过滤器缺少init(Map&lt; String,String&gt;)方法(对于RemoveDuplicateTokenFilter来说,这是一种奇怪的沉默)。所以我选择构建一个分析器并坚持使用它。示例代码将是这样的:
class MyCustomAnalyzer extends Analyzer {
@Override TokenStreamComponents createComponents(String fieldname, Reader reader) {
Tokenizer source = new WhitespaceTokenizer(Version.LUCENE_43, reader)
TokenFilter filter = new MyCustomTokenFilter(source)
new TokenStreamComponents(source, filter)
}
}
然后像这样配置:
<fieldType name="text_mc" class="solr.TextField">
<analyzer type="index" class="com...MyCustomAnalyzer"/>>
....
</fieldType>