org.apache.lucene.analysis(一)

Package org.apache.lucene.analysis Description

文本分析。
API 和 代码将文本转换成 可索引/可搜索的 标记。包括 Analyzer 和相关类。

Parsing? Tokenization? Analysis!

Lucene,一个 索引 和 检索 库,只接受纯文本输入。

Parsing

在Lucene上构建搜索功能的应用程序可能支持各种格式的文档——HTML、XML、PDF、Word等等。Lucene 不关心这些和其他文档格式的解析,使用 Lucene 的应用程序有责任使用适当的解析器将原始格式转换为纯文本,然后再将纯文本传递给 Lucene。

Tokenization

传递给Lucene用于建立索引的纯文本要经过一个通常称为标记化的过程。标记化是将输入文本分解为小索引元素的过程——标记。输入文本被分解成标记的方式极大地影响了人们随后如何搜索该文本。举个例子,可以识别句子的开头和结尾,以提供更准确的短语和接近性搜索(虽然句子识别没有由Lucene提供)。
一些情况下,简单将文本分解成标记是不够的——需要更有深度的 Analysis。Lucene 包括“标记化前”和“标记化后”分析工具。
Pre-tokenization 分析器可以包括(但不限于)剥离HTML标记,转换或删除匹配任意模式或固定字符串集的文本。
这里有一些可被执行 post-tokenization 的步骤,包括(但不限于):

  • Stemming - 用词干代替单词。例如,英语词干“bikes”被替换成“bike”;现在,查询“bike”可以同时找到包含“bike”和那些包含“bikes”的文档。
  • Stop Words Filtering - 共同词汇像“the”,“and”和“a”很少有查询的意义。删除它们可以缩小索引大小并提高性能。可能同样减少一些“noise”并且实际上提升查询质量。
  • Text Normalization - 去掉重音和其他字符标记可以更好地进行搜索。
  • Synonym Expansion - 在与当前单词相同的标记位置添加同义词意味着用户在搜索同义词集中的单词时可以进行更好的匹配。

Core Analysis

analysis 包提供了把 Strings 和 Readers 转换成能被 Lucene 索引的 tokens 的机制。包中有四个主要的类,所有的分析过程都是从这些类中派生出来的。这些是:

  • Analyzer - 负责提供一个可被索引和搜索进程使用的TokenStream。参见下面关于实现您自己的Analyzer的更多信息。大多数情况下,您可以使用 Analyzer 的匿名子类。
  • CharFilter - CharFilter 继承 Reader 以在标记文本之前对其进行转换,同时提供校正的字符偏移量来考虑这些修改。当从经过 charfilter 修改的带有与原始文本中不同偏移量的文本创建索引标记时,此功能允许高亮显示原始文本。Tokenizer.setReader(java.io.Reader) 接受 CharFilters.CharFilters 可以链式的执行多个 pre-tokenization 修改。
  • Tokenizer - Tokenizer 是一个 TokenStream 并且负责将传入文本分解为令牌。在一些场景中,Analyzer 将会使用 Tokenizer 作为分析过程的第一步。然而,在标记化之前修改文本,使用 CharFilter 子类(见上)。
  • TokenFilter - TokenFilter 是一个 TokenStream 并且负责修改由Tokenizer创建的令牌。TokenFilter 执行的常见修改包括:删除、词干、同义词注入和大小写折叠。并不是所有的分析器都需要标记过滤器。

Hints,Tips and Traps

Analyzer 和 CharFilters,Tokenizers 和 TokenFilters 之间的关系有时令人困惑。为了减轻这种困惑,这里有一些说明:

  • Analyzer 对于 analysis 链来说是一个工厂。Analyzer 不处理文本,Analyzers 创建 CharFilters,Tokenizers,或 TokenFilters 来处理文本。一个 Analyzer 有两个任务:生成接受 reader 并生成令牌的 TokenStreams,和包装或以其他方式预处理 Reader 对象。
  • CharFilter 是 Reader 的一个子类,它支持偏移跟踪。
  • Tokenizer 仅负责将传入的文本分解成标记。
  • tokenfilter 修改标记流及其内容。
  • Tokenizer 是一个 TokenStream,但 Analyzer 不是。
  • Analyzer 是“字段感知的”,但是Tokenizer不是。分析程序在构造 TokenStream 时可能会考虑字段名。

如果你想特殊组合 CharFilters,Tokenizer,和一些 TokenFilters ,最简单的通常是创建一个 Analyzer 的匿名内部类,提供 Analyzer.createComponents(String) 获取也需要 Analyzer.initReader(String, java.io.Reader)。然而,如果你需要反复的在一些地方设置同样的 component,你可以创建一个 Analyzer 子类。事实上,Apache Lucene 提供了大量的 Analyzer 类,它们提供了有用的分析链。这些里最常用的是 StandardAnalyzer。Many applications will have a long and industrious life with nothing more than the StandardAnalyzer。analyzers-common 库提供了许多针对不同语言已存在的分析器。analysis-common 库还允许在不使用 CustomAnalyzer 类进行子类化的情况下配置自定义Analyzer。
除了 StandardAnalyzer,Lucene 包含几个包含分析组件的组件,它们都位于发行版的“analysis”目录下。其中一些支持特定的语言,另一些集成外部组件。“common”子文件夹下有一些值得注意的多用途的分析器,包括 PreFieldAnalyzerWrapper。大多数分析器对所有字段执行相同的操作。PerFieldAnalyzerWrapper 可以用来将不同的 Analyzer 与不同的 Fields 关联起来。在分析领域有大量的功能,您应该仔细研究它以找到您需要的部分。
分析是导致索引缓慢的主要原因之一。简而言之,分析得越多,索引就越慢(在大多数情况下)。也许您的应用程序使用简单的WhitespaceTokenizer 与 StopFilter 结合会很好。基准/库对于测试分析过程的速度非常有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值