今天在群里看到有人在问:如何用solr设置某个字段是索引但不分词的?
一想到的就是solr.strField类型,突发其想看一下源代码
StrField简单的继承父类FieldType,其中有个分析字段,如果在配置中没有设置这个类型的索引与查询分词器,就会使用默认的分词器
DefaultAnalyzer
,如下,这个分词器没有进行切词,不过有限定字符长度 。小于这个长度的字符串会原串保存下来,否则截取
/**
* Analyzer set by schema for text types to use when indexing fields
* of this type, subclasses can set analyzer themselves or override
* getAnalyzer()
* @see #getAnalyzer
* @see #setAnalyzer
*/
protected Analyzer analyzer=new DefaultAnalyzer(256);
/**
* Analyzer set by schema for text types to use when searching fields
* of this type, subclasses can set analyzer themselves or override
* getAnalyzer()
* @see #getQueryAnalyzer
* @see #setQueryAnalyzer
*/
protected Analyzer queryAnalyzer=analyzer;
/** * Default analyzer for types that only produce 1 verbatim token... * A maximum size of chars to be read must be specified */ protected final class DefaultAnalyzer extends SolrAnalyzer { final int maxChars; DefaultAnalyzer(int maxChars) { this.maxChars=maxChars; } @Override public TokenStreamInfo getStream(String fieldName, Reader reader) { Tokenizer ts = new Tokenizer(reader) { final char[] cbuf = new char[maxChars]; final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class); @Override public boolean incrementToken() throws IOException { clearAttributes(); int n = input.read(cbuf,0,maxChars); if (n<=0) return false; String s = toInternal(new String(cbuf,0,n)); termAtt.setEmpty().append(s); offsetAtt.setOffset(correctOffset(0),correctOffset(n)); return true; } }; return new TokenStreamInfo(ts, ts); } }
这里