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 - xyz@example.com"
WhitespaceAnalyzer:以空格作为切词标准,不对语汇单元进行其他规范化处理
[XY&Z] [Corporation] [-] [xyz@example.com]
SimpleAnalyzer: 以非字母符来分割文本信息,并将语汇单元统一为小写形式,并去掉数字类型的字符
[xy] [z] [corporation] [xyz] [example] [com]
StopAnalyzer: 该分析器会去除一些常有a,the,an等等,也可以自定义禁用词
[xy] [z] [corporation] [xyz] [example] [com]
StandardAnalyzer: Lucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号
[xy&z] [corporation] [xyz@example.com]
其实上述的四个Analyzer都是继承自Analyzer,而Analyzer是一个抽象类,它只提供了一个叫tokenStream的虚函数,
public final class WhitespaceAnalyzer extends Analyzer {
}
WhitespaceAnalyzer和SimpleAnalyzer非常的简单,它们只是把功能实现分别托管给了WhitespaceTokenizer和LowerCaseTokenizer。
public final class StopAnalyzer extends Analyzer {
}
public class StandardAnalyzer extends Analyzer {
public static final String[] STOP_WORDS = StopAnalyzer.ENGLISH_STOP_WORDS;
public TokenStream tokenStream(String fieldName, Reader reader) {
}
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中搜索。
mm: minimal should match。Solr支持三种查询clause,即“必须出现”, “不能出现”和“可以出现”,分别对应于AND, -, OR。
在默认情况下,使用OR这个clause。mm用于设置在使用OR这个clause时,需要出现最少的满足条件的clause数量
bq: 对某个field的value进行boost,例如brand:IBM^5.0。