Analyzer的作用就是把文本分解为便于Lucene处理的token,Lucene有四个自带的Analyzer,分别是WhitespaceAnalyzer、SimpleAnalyzer、StopAnalyzer、StandardAnalyze。
Analyzing "The quick brown fox jumped over the lazy dogs"
WhitespaceAnalyzer: 以空格作为切词标准,不对语汇单元进行其他规范化处理
[The] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
SimpleAnalyzer: 以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符
[the] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
StopAnalyzer: 该分析器会去除一些常有a,the,an等等,也可以自定义禁用词
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
StandardAnalyzer: Lucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
Analyzing "XY&Z Corporation - [email protected]"
WhitespaceAnalyzer:以空格作为切词标准,不对语汇单元进行其他规范化处理
[XY&Z] [Corporation] [-] [[email protected]]
SimpleAnalyzer: 以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符
[xy] [z] [corporation] [xyz] [example] [com]
StopAnalyzer: 该分析器会去除一些常有a,the,an等等,也可以自定义禁用词
[xy] [z] [corporation] [xyz] [example] [com]
StandardAnalyzer: Lucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号
[xy&z] [corporation] [[email protected]]
其实上述的四个Analyzer都是继承自Analyzer,而Analyzer是一个抽象类,它只提供了一个叫tokenStream的虚函数,
public final class WhitespaceAnalyzer extends Analyzer {
public TokenStream tokenStream(String fieldName, Reader reader) {
return new WhitespaceTokenizer(reader);
}
}
WhitespaceAnalyzer和SimpleAnalyzer非常的简单,它们只是把功能实现分别托管给了WhitespaceTokenizer和LowerCaseTokenizer。
public final class StopAnalyzer extends Analyzer {
private Set stopWords;
public static final String[] ENGLISH_STOP_WORDS = {
"a", "an", "and", "are", "as", "at", "be", "but", "by",
"for", "if", "in", "into", "is", "it",
"no", "not", "of", "on", "or", "s", "such",
"t", "that", "the", "their", "then", "there", "these",
"they", "this", "to", "was", "will", "with"
};
…
public TokenStream tokenStream(String fieldName, Reader reader) {
return new StopFilter(new LowerCaseTokenizer(reader), stopWords);
}
}
public class StandardAnalyzer extends Analyzer {
private Set stopSet;
public static final String[] STOP_WORDS = StopAnalyzer.ENGLISH_STOP_WORDS;
public TokenStream tokenStream(String fieldName, Reader reader) {
TokenStream result = new StandardTokenizer(reader);
result = new StandardFilter(result);
result = new LowerCaseFilter(result);
result = new StopFilter(result, stopSet);
return result;
}
}
StopAnalyzer 其实是把功能托管给了StopFilter,而StandardAnalyzer最复杂,它用到了三个Filter,分别是StandardFilter、LowerCaseFilter和StopFilter
四个Analyzer其实只和两个类型在打交道,就是各种Tokenizer和各种Filter
原来各种Filter都继承自TokenFilter,各种Tokenizer都继承自Tokenizer
而这两个抽象类又全都继承自TokenStream,TokenFilter除了继承自TokenStream以外还拥有一个TokenStream的实例
TokenStream其实就是一个token流,或者说token的序列。
TokenStream只提供了一个虚函数next,每次调用next函数就可以获得TokenStream中的一个token,重复调用就可以遍历一个TokenStream中的所有token
Tokenizer是一个以Reader为输入的TokenStream;而TokenFilter是一个以另一个TokenStream为输入的TokenStream
Tokenizer被用来做初级的文本处理,它把从Reader读入的原始文本通过一些简单的办法处理成一个个初级的token,TokenFilter则以Tokenizer为输入(因为Tokenizer继承自
TokenStream),用一些规则过滤掉不符合要求的token(像StopFilter中的停用词),产生最终的token stream。还记得前文说的WhitespaceAnalyzer和SimpleAnalyzer引用的都是
Tokenizer,StopAnalyzer和StandardAnalyzer引用的都是TokenFilter吗?就是因为前二者处理规则比较简单,用Tokenizer把Reader的输入经过一步处理就够了
;后二者处理要复杂一些,需要用到TokenFilter,而TokenFilter在Tokenizer处理的基础上进行一些过滤,这样才能满足后二者的需要
Dismax与Edismax的作用
fl: 是逗号分隔的列表,用来指定文档结果中应返回的 Field
集。默认为 “*
”,指所有的字段。如果需要加上Score,可以写成 *,score
defType: 指定query parser,常用defType=lucene, defType=dismax, defType=edismax
q.alt: 当q字段为空时,用于设置缺省的query,通常设置q.alt为*:*。
qf: query fields,指定solr从哪些field中搜索。
pf: 用于指定一组field,当query完全匹配pf指定的某一个field时,来进行boost。简言之pf的作用是boosting phrases over words。
mm: minimal should match。Solr支持三种查询clause,即“必须出现”, “不能出现”和“可以出现”,分别对应于AND, -, OR。
在默认情况下,使用OR这个clause。mm用于设置在使用OR这个clause时,需要出现最少的满足条件的clause数量
bq: 对某个field的value进行boost,例如brand:IBM^5.0。