在SOLR 4.3.0中使用TokenFilterFactory的自定义类

时间:2013-05-13 23:32:45

标签: solr lucene

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

非常感谢你的帮助!

2 个答案:

答案 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>