Solr字符串字段类型最大可索引字符数
我使用solr字符串字段来提供文本字段上的精确匹配(我已经查看了文本字段类型,不相信它对我有用-我想精确地重现Sql的类似功能,包括空格和通配符) 我的问题是,当我索引大型文本字段时,Solr在搜索这些字段时不会返回任何数据。该限制似乎是int16.max 作为测试,我创建了一个带有Solr字符串字段类型最大可索引字符数,solr,Solr,我使用solr字符串字段来提供文本字段上的精确匹配(我已经查看了文本字段类型,不相信它对我有用-我想精确地重现Sql的类似功能,包括空格和通配符) 我的问题是,当我索引大型文本字段时,Solr在搜索这些字段时不会返回任何数据。该限制似乎是int16.max 作为测试,我创建了一个带有id字段和string字段的索引。如果id字段为“1”,且string字段包含40000个字符: id:1将返回两个字段,其中包含40000个字符,表明它已被索引 string:不返回任何结果 如果字符串字段仅包
id
字段和string
字段的索引。如果id
字段为“1”,且string
字段包含40000个字符:
将返回两个字段,其中包含40000个字符,表明它已被索引id:1
不返回任何结果string:
还有其他人遇到过这个问题或找到了解决方法吗?我花了很多时间在这个问题上,所以我发布了我提出的解决方案,以防其他人遇到这个问题。使用文本字段类型和关键字标记器的工作方式与字符串字段类似,一直到我遇到的字符串字段类型的长度限制 最终,我在阅读后创建了一个自定义标记器,并做了一些更改:
isTokenChar
的方法,返回!字符。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个字符)。如果有人找到更好的方法,请发布 我不确定这一点,但这可以被视为一种解决办法。尝试使用“Text”字段类型和“KeywordTokenizer”一起使用,这将像“string”字段一样工作..我试过了,但不起作用。您是否将标记器添加到任何其他配置文件中?我通过将其添加到配置xml中来创建它。但是您是否在没有ngram筛选器的情况下管理字段子字符串的查找匹配?