1

我正在尝试升级我的自定义类以支持 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);

非常感谢你的帮助!!!

4

2 回答 2

1

我刚刚将空映射传递给 CustomFilterFactory 方法,一切都运行良好。

  Map<String,String> args = new HashMap<String, String>();
  CustomFilterFactory factory = new CustomFilterFactory(args);
于 2013-05-21T18:48:11.707 回答
1

不是解决方案,而是解决方法。您可以选择配置自定义分析器。我查看了 RemoveDuplicateTokenFilter 源,示例配置尝试为 MyCustomFilter 和 MyCustomFilterFactory 复制,但它没有用。具体来说,SolrResourceLoader 一直抱怨我的自定义令牌过滤器缺少 init(Map<String,String>) 方法(对于 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>
于 2013-08-07T23:42:32.613 回答