java - 自定义过滤器不适用于 solr

标签 java solr filter lucene

我为 solr 4.2 创建了一个自定义过滤器工厂。它运行良好。但是当我尝试将 solr-4.2 升级到 4.7 版本时,它报告错误:

Caused by: org.apache.solr.common.SolrException: Plugin init failure for [schema.xml] analyzer/filter: Error instantiating class: 'org.apache.lucene.analysis.ExtendedNameFilterFactory'

这是工厂的 java 代码:

package org.apache.lucene.analysis;

import java.util.Map;
import org.apache.lucene.analysis.util.AbstractAnalysisFactory;
import org.apache.lucene.analysis.util.MultiTermAwareComponent;
import org.apache.lucene.analysis.util.TokenFilterFactory;

public class ExtendedNameFilterFactory extends TokenFilterFactory
  implements MultiTermAwareComponent
{
  int extendedWordCount;

  public void init(Map<String, String> args)
  {
    super.init(args);
    assureMatchVersion();
    this.extendedWordCount = getInt("extendedWordCount", -1);
  }

  public ExtendedNameFilter create(TokenStream input) {
    return new ExtendedNameFilter(this.luceneMatchVersion, input, this.extendedWordCount);
  }

  public AbstractAnalysisFactory getMultiTermComponent()
  {
    return this;
  }
}

对于过滤器:

package org.apache.lucene.analysis;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.util.CharacterUtils;
import org.apache.lucene.util.Version;

public final class ExtendedNameFilter extends TokenFilter
{
  private final CharTermAttribute termAtt = (CharTermAttribute)addAttribute(CharTermAttribute.class);
  private PositionIncrementAttribute posIncAttr;
  private OffsetAttribute setOffsetAttr;
  private final int extendedWordCount;
  LinkedList<String> list = new LinkedList();
  ArrayList<Integer> startOffsetList = new ArrayList();
  int endOffset = 0;
  int count = 0;

  public ExtendedNameFilter(Version matchVersion, TokenStream in, int extendedWordCount)
  {
    super(in);
    CharacterUtils.getInstance(matchVersion);
    this.extendedWordCount = extendedWordCount;
    this.posIncAttr = ((PositionIncrementAttribute)addAttribute(PositionIncrementAttribute.class));
    this.setOffsetAttr = ((OffsetAttribute)addAttribute(OffsetAttribute.class));
  }

  public final boolean incrementToken()
    throws IOException
  {
    int len = 0;

    while (this.input.incrementToken()) {
      this.list.add(this.termAtt.toString());
      this.startOffsetList.add(Integer.valueOf(this.setOffsetAttr.startOffset()));
      this.endOffset = this.setOffsetAttr.endOffset();
    }

    Iterator iterator = this.list.iterator();
    len = this.list.size();

    if ((len > 0) && (this.extendedWordCount < 0)) {
      this.termAtt.setEmpty();
      while (iterator.hasNext()) {
        this.termAtt.append((CharSequence)iterator.next());
      }
      this.list.removeFirst();

      this.posIncAttr.setPositionIncrement(10);
      this.setOffsetAttr.setOffset(((Integer)this.startOffsetList.get(this.count)).intValue(), this.endOffset);
      this.count += 1;
      return true;
    }
    if ((len > 0) && (this.count < this.extendedWordCount)) {
      this.termAtt.setEmpty();
      while (iterator.hasNext()) {
        this.termAtt.append((CharSequence)iterator.next());
      }
      this.list.removeFirst();

      this.posIncAttr.setPositionIncrement(10);
      this.setOffsetAttr.setOffset(((Integer)this.startOffsetList.get(this.count)).intValue(), this.endOffset);
      this.count += 1;
      return true;
    }

    return false;
  }
}

它在 solr 4.2 上运行良好。谁能告诉我在 solr 4.7.1 中运行它需要进行哪些更改?

最佳答案

AbstractAnalysisFactory 不再使用 init 方法来传入参数。覆盖 constructor相反。

关于java - 自定义过滤器不适用于 solr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23731503/

相关文章:

javascript - 如何让这个工作顺利进行?

java - 检查我是否可以删除文件

Solr 6.1 - 我收藏的 `managed-schema` 文件在哪里

Solr 查询以

json - 使用 jq 展平嵌套的 JSON

algorithm - 需要 Krovetz 词干提取算法 ( KStemming) 帮助

ios - 查找searBar.text是否包含整数字符串?

java - 依赖注入(inject)可以被认为是工厂方法模式的替代品吗?

java - 使用 Eclipse 调试 OpenJDK 源代码

java - 如何为 JPA Criteria Group By 子句创建表达式列表?