-
搜索引擎后台模块简图
-
在Lucene中,一个标准的分析器由两部分组成。一部分是分词器,被称为Tokenizer,另一部分是过滤器,被称为TokenFilter。一个分析器往往由一个分词器和多个过滤器组成,这里所说的过滤器与上一部分所说的过滤器是完全不同的两个概念,此处的Filter主要是用于对用户切出来的词进行一些处理,如去掉一些敏感词、转换大小写、转换单复数等。
TokenFilter的构造函数接收的是TokenStream的实例,也就是说这里会出现两种情况:一是TokenFilter可以和别的TokenFilter嵌套在一起,形成一个嵌套的管道过滤器结构;二是TokenFilter可以和Tokenizer结合在一起,用以过滤从Tokenizer中切分出来的词。就是这种嵌套,形成了Lucene的分析器的核心结构。
-
需要一种方法,首先定义用户将要使用的语言(也就是用户查询语言),然后对用户语言生成某种解析器,从中得到关键信息,以帮助搜索引擎理解用户的需要。这就是JavaCC出现的原因。
JavaCompiler Compiler
-
在org.apache.lucene.analysis.standard下有如下7个类,它们都是JavaCC为Lucene生成的。
CharStream
ParseException
StandardTokenizer
StandardTokenizerConstants
StandardTokenizerTokenManager
Token
TokenMgrError
-
Lucene专门设计了标准分析器来使用StandardTokenizer,这就是StandardAnalyzer。
-
StandardFilter主要是对切分出来的省略语(如He’s或You’d)和以“.”号分隔的缩略语(如U.S.A)进行处理,next方法返回一个处理后的新的Token。事实上,这种处理对中文的意义并不大,仅针对一些欧美文字具有很好的效果。
-
LowerCaseFilter用来将字母从大写转为小写,只对欧美国家语言适用。
-
StopFilter是用来过滤忽略词的过滤器。
-
无论使用多少个Filter,都必须首先使用一个Tokenizer,也就是说Tokenizer要处于整个过滤器结构的起始位置。另外,Filter的顺序不同,也会影响到最终的结果,这需要在开发时注意。
-
LengthFilter是analysis包下的一个过滤器,它的作用是限制一些词条的长度,但某个词条的长度超过或小于它的限制时,他就将返回一个null。
-
PerFieldAnalyzerWrapper分析器适用于一篇文档的多个Field需要使用不同的Analyzer来进行分析时的情况。当无法找到与Field对应的Analyzer时,就适用这个默认的Analyzer。