私はこれに多くの時間を費やしたので、他の誰かがこの問題に遭遇した場合に備えて、私が思いついた解決策を投稿しています。キーワードトークンライザーでテキストフィールドタイプを使用すると、文字列フィールドタイプと同じように機能し、文字列フィールドタイプで遭遇した長さの制限まで機能しました。
最終的に、いくつかの変更を加えてこのスレッドを読んだ後、カスタムトークナイザーを作成しました。
彼は標準の動作を望んでいたので、彼はStandardTokenizerに基づいていますが、私はそれを文字列フィールドのように動作させたいと思っていました。私は最初にKeywordTokenizerを使用しようとしましたが、それでも制限に達したため、最終的にはWhitespaceTokenizerをベースにしました(以下で詳しく説明します)。
そこにあるコードは古く、Solr4.0では機能しません。
isTokenChar
WhitespaceTokenizerのコードは非常に短く、 returnsと呼ばれるメソッドが含まれています!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;
}
}
schema.xml:
<fieldType name="text_block" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="custom.analysis.MyCustomTokenizerFactory" />
</analyzer>
</fieldType>
このアプローチを使用して、文字列フィールドなどの機能で大きなテキストフィールド(> 100k文字)にインデックスを付けることができました。誰かがより良い方法を見つけたら、それを投稿してください!