我在这方面花了很多时间,所以我发布了我想出的解决方案,以防其他人遇到这个问题。使用带有 KeywordTokenizer 的文本字段类型确实像字符串字段一样工作,一直到我在使用字符串字段类型时遇到的长度限制。
最终,我在阅读了这个线程后创建了一个自定义标记器,并进行了一些更改:
他想要标准行为,所以他基于 StandardTokenizer,而我希望它像字符串字段一样。我第一次尝试使用 KeywordTokenizer,但仍然遇到限制,所以最终我基于 WhitespaceTokenizer(更多内容见下文)。
那里的代码已过时,不适用于 Solr 4.0。
WhitespaceTokenizer 的代码很短,它包含一个称为isTokenChar
返回的方法!Character.isWhitespace(c);
。我只是将其更改为始终返回 true。之后,我创建了一个 TokenizerFactory 来返回它并在 schema.xml 中引用它,就像链接线程一样。
MyCustomTokenizer.java:
package custom.analysis;
import java.io.Reader;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.util.CharTokenizer;
import org.apache.lucene.util.AttributeSource;
import org.apache.lucene.util.Version;
public final class MyCustomTokenizer extends CharTokenizer {
public MyCustomTokenizer(Version matchVersion, Reader in) {
super(matchVersion, in);
}
public MyCustomTokenizer(Version matchVersion, AttributeSource source, Reader in) {
super(matchVersion, source, in);
}
public MyCustomTokenizer(Version matchVersion, AttributeFactory factory, Reader in) {
super(matchVersion, factory, in);
}
@Override
protected boolean isTokenChar(int c) {
return true; //!Character.isWhitespace(c);
}
}
MyCustomTokenizerFactory.java:
package custom.analysis;
import org.apache.lucene.analysis.util.TokenizerFactory;
import org.apache.lucene.analysis.core.KeywordTokenizerFactory;
import org.apache.lucene.analysis.core.KeywordTokenizer;
import java.io.Reader;
import org.apache.lucene.util.Version;
public class MyCustomTokenizerFactory extends TokenizerFactory {
public MyCustomTokenizer create(Reader input) {
final MyCustomTokenizer tokenizer = new MyCustomTokenizer(Version.LUCENE_40, input);
return tokenizer;
}
}
架构.xml:
<fieldType name="text_block" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="custom.analysis.MyCustomTokenizerFactory" />
</analyzer>
</fieldType>
使用这种方法,我能够使用字符串字段等功能索引大型文本字段(>100k 个字符)。如果有人找到更好的方法,请发布!