Lucene分析仪的比较

有人可以解释一下Lucene中不同分析器的区别吗? 我得到一个maxClauseCountexception,我明白,我可以通过使用KeywordAnalyzer避免这种情况,但我不想从StandardAnalyzer更改,而不理解有关分析器的问题。 非常感谢。

一般来说,Lucene中的任何分析器都是tokenizer + stemmer +停用词filter。

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

Stemmers被用来获取有关单词的基础。 这很大程度上取决于所使用的语言。 例如,对于以前的英语短语,会出现类似[“i”,“be”,“veri”,“happi”]和法语“Je suistrèsheureux”的某种法语分析器(如SnowballAnalyzer ,初始化为“法语”)将产生[“je”,“être”,“tre”,“heur”]。 当然,如果您将使用一种语言的分析器来干扰另一种语言的文本,则将使用来自其他语言的规则,并且可能会产生不正确的结果。 这并不是所有系统的失败,但search结果可能不太准确。

KeywordAnalyzer不使用任何词干分析器,它通过所有未经修改的字段。 因此,如果您要search英文文本中的某些词汇,那么使用此分析器并不是一个好主意。

停止词是最常见和几乎无用的词。 这又一次严重依赖于语言。 对于英语来说,这些词是“a”,“the”,“I”,“be”,“have”等。停用词filter将它们从令牌stream中移除以降低search结果中的噪声,因此最后我们的短语“I StandardAnalyzer “非常高兴”将被转换为列表[“veri”,“happi”]。

KeywordAnalyzer再次没有任何作用。 因此, KeywordAnalyzer用于ID或电话号码等用途,但不适用于普通文本。

至于你的maxClauseCountexception,我相信你会在search。 在这种情况下,很可能是因为search查询过于复杂。 尝试将其拆分为多个查询或使用更多低级别的函数。