《开发自己的搜索引擎》读书笔记——Lucene的分析器

时间:2023-01-13 08:16:30
  1. 搜索引擎后台模块简图《开发自己的搜索引擎》读书笔记——Lucene的分析器

  2. 在Lucene中,一个标准的分析器由两部分组成。一部分是分词器,被称为Tokenizer,另一部分是过滤器,被称为TokenFilter。一个分析器往往由一个分词器和多个过滤器组成,这里所说的过滤器与上一部分所说的过滤器是完全不同的两个概念,此处的Filter主要是用于对用户切出来的词进行一些处理,如去掉一些敏感词、转换大小写、转换单复数等。

    TokenFilter的构造函数接收的是TokenStream的实例,也就是说这里会出现两种情况:一是TokenFilter可以和别的TokenFilter嵌套在一起,形成一个嵌套的管道过滤器结构;二是TokenFilter可以和Tokenizer结合在一起,用以过滤从Tokenizer中切分出来的词。就是这种嵌套,形成了Lucene的分析器的核心结构。

  3. 需要一种方法,首先定义用户将要使用的语言(也就是用户查询语言),然后对用户语言生成某种解析器,从中得到关键信息,以帮助搜索引擎理解用户的需要。这就是JavaCC出现的原因。

    JavaCompiler Compiler

  4. 在org.apache.lucene.analysis.standard下有如下7个类,它们都是JavaCC为Lucene生成的。

    CharStream

    ParseException

    StandardTokenizer

    StandardTokenizerConstants

    StandardTokenizerTokenManager

    Token

    TokenMgrError

  5. Lucene专门设计了标准分析器来使用StandardTokenizer,这就是StandardAnalyzer。

  6. StandardFilter主要是对切分出来的省略语(如He’s或You’d)和以“.”号分隔的缩略语(如U.S.A)进行处理,next方法返回一个处理后的新的Token。事实上,这种处理对中文的意义并不大,仅针对一些欧美文字具有很好的效果。

  7. LowerCaseFilter用来将字母从大写转为小写,只对欧美国家语言适用。

  8. StopFilter是用来过滤忽略词的过滤器。

  9. 无论使用多少个Filter,都必须首先使用一个Tokenizer,也就是说Tokenizer要处于整个过滤器结构的起始位置。另外,Filter的顺序不同,也会影响到最终的结果,这需要在开发时注意。

  10. LengthFilter是analysis包下的一个过滤器,它的作用是限制一些词条的长度,但某个词条的长度超过或小于它的限制时,他就将返回一个null。

  11. PerFieldAnalyzerWrapper分析器适用于一篇文档的多个Field需要使用不同的Analyzer来进行分析时的情况。当无法找到与Field对应的Analyzer时,就适用这个默认的Analyzer。