【问题标题】:Comparison of Lucene AnalyzersLucene 分析器的比较
【发布时间】:2011-07-25 22:18:33
【问题描述】:

有人可以解释一下 Lucene 中不同分析器之间的区别吗?我收到一个 maxClauseCount 异常,并且我知道我可以通过使用 KeywordAnalyzer 来避免这种情况,但我不想在不了解分析器周围的问题的情况下从 StandardAnalyzer 进行更改。非常感谢。

【问题讨论】:

标签: lucene analyzer


【解决方案1】:

一般来说,Lucene 中的任何分析器都是分词器 + 词干分析器 + 停用词过滤器。

Tokenizer 将您的文本分割成块,并且由于不同的分析器可能使用不同的标记器,您可以获得不同的输出 token 流,即文本块的序列。例如,您提到的KeywordAnalyzer 根本不拆分文本,并将所有字段作为单个标记。同时,StandardAnalyzer(和大多数其他分析器)使用空格和标点符号作为分割点。例如,对于短语“我很高兴”,它将产生列表 [“i”、“am”、“very”、“happy”](或类似的东西)。有关特定分析器/标记器的更多信息,请参阅其Java Docs

词干用于获取相关单词的基础。这在很大程度上取决于所使用的语言。例如,对于英文中的前一个短语,会产生类似 ["i", "be", "veri", "happi"] 的东西,而对于法语 "Je suis très heureux" 会产生某种法语分析器(如 @987654322 @,用“French”初始化)将产生[“je”,“être”,“tre”,“heur”]。当然,如果您将使用一种语言的分析器来提取另一种语言的文本,则将使用另一种语言的规则,并且词干分析器可能会产生错误的结果。并非所有系统都失败,但搜索结果可能不太准确。

KeywordAnalyzer 不使用任何词干分析器,它通过未修改的所有字段。所以,如果你要在英文文本中搜索一些单词,使用这个分析器不是一个好主意。

停用词是最常见且几乎无用的词。同样,它在很大程度上取决于语言。对于英语,这些词是“a”、“the”、“I”、“be”、“have”等。停用词过滤器将它们从标记流中删除以降低搜索结果中的噪音,所以最后我们的短语“I 'm very happy" 与 StandardAnalyzer 将转换为列表 ["veri", "happi"]。

KeywordAnalyzer 又什么都不做。因此,KeywordAnalyzer 用于 ID 或电话号码等内容,但不适用于普通文本。

至于你的maxClauseCount 例外,我相信你在搜索时就会明白。在这种情况下,很可能是因为搜索查询过于复杂。尝试将其拆分为多个查询或使用更多低级函数。

【讨论】:

  • @ffriend:我不认为 Stemmer(使用雪球或其他算法)可以转换 am -> 因为它是 Lemmatizer 的工作。你可以在这里查看snowball.tartarus.org/demo.php
  • 那么 Tika 在哪​​里适合呢?从技术上讲,它不是分析仪吗?
  • @anon:Tika 是一个独立的项目,具有几个关键特性。假设您的意思是 Tika 解析器,我会说 Tika 采用字节流并输出文本 + 元数据,而 Lucene 分析器采用文本并输出处理后的令牌流。例如,您可以先使用 Tika 解析 PDF 或 XML 文件,生成包含“标题”、“作者”和“文本”等字段的文档,然后使用 Lucene 分析器分析部分或全部这些字段。
  • 只是想知道,“very”和“happy”不是拒绝词,为什么会变成“veri”和“happi”?是否匹配 iy 差异,因为它们听起来相似?
【解决方案2】:

在我看来,我使用过StandAnalyzerSmartCNAnalyzer。因为我必须用中文搜索文本。显然,SmartCnAnalyzer 更擅长处理中文。出于不同的目的,您必须选择最合适的分析仪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多