Lucene学习

来源:互联网 发布:酷狗音乐网络播放器 编辑:程序博客网 时间:2024/05/20 18:50

Analyzer的作用就是把文本分解为便于Lucene处理的tokenLucene有四个自带的Analyzer,分别是WhitespaceAnalyzerSimpleAnalyzerStopAnalyzerStandardAnalyze

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 {

            public TokenStream tokenStream(String fieldName, Reader reader) {

                 return new WhitespaceTokenizer(reader);

            }

}

WhitespaceAnalyzerSimpleAnalyzer非常的简单,它们只是把功能实现分别托管给了WhitespaceTokenizerLowerCaseTokenizer

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,分别是StandardFilterLowerCaseFilterStopFilter

四个Analyzer其实只和两个类型在打交道,就是各种Tokenizer和各种Filter

原来各种Filter都继承自TokenFilter,各种Tokenizer都继承自Tokenizer

而这两个抽象类又全都继承自TokenStreamTokenFilter除了继承自TokenStream以外还拥有一个TokenStream的实例

TokenStream其实就是一个token流,或者说token的序列。

TokenStream只提供了一个虚函数next,每次调用next函数就可以获得TokenStream中的一个token,重复调用就可以遍历一个TokenStream中的所有token

Tokenizer是一个以Reader为输入的TokenStream;而TokenFilter是一个以另一个TokenStream为输入的TokenStream

Tokenizer被用来做初级的文本处理,它把从Reader读入的原始文本通过一些简单的办法处理成一个个初级的tokenTokenFilter则以Tokenizer为输入(因为Tokenizer继承自

TokenStream,用一些规则过滤掉不符合要求的token(像StopFilter中的停用词),产生最终的token stream。还记得前文说的WhitespaceAnalyzerSimpleAnalyzer引用的都是

TokenizerStopAnalyzerStandardAnalyzer引用的都是TokenFilter吗?就是因为前二者处理规则比较简单,用TokenizerReader的输入经过一步处理就够了

;后二者处理要复杂一些,需要用到TokenFilter,而TokenFilterTokenizer处理的基础上进行一些过滤,这样才能满足后二者的需要

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。

q.op: 覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑  qt: query type,指定那个类型来处理查询请求,一般不用指定,默认是standard

原创粉丝点击