【发布时间】:2011-07-25 22:18:33
【问题描述】:
有人可以解释一下 Lucene 中不同分析器之间的区别吗?我收到一个 maxClauseCount 异常,并且我知道我可以通过使用 KeywordAnalyzer 来避免这种情况,但我不想在不了解分析器周围的问题的情况下从 StandardAnalyzer 进行更改。非常感谢。
【问题讨论】:
-
查看这个以获得更详细的答案 - baeldung.com/lucene-analyzers
有人可以解释一下 Lucene 中不同分析器之间的区别吗?我收到一个 maxClauseCount 异常,并且我知道我可以通过使用 KeywordAnalyzer 来避免这种情况,但我不想在不了解分析器周围的问题的情况下从 StandardAnalyzer 进行更改。非常感谢。
【问题讨论】:
一般来说,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 例外,我相信你在搜索时就会明白。在这种情况下,很可能是因为搜索查询过于复杂。尝试将其拆分为多个查询或使用更多低级函数。
【讨论】:
在我看来,我使用过StandAnalyzer 和SmartCNAnalyzer。因为我必须用中文搜索文本。显然,SmartCnAnalyzer 更擅长处理中文。出于不同的目的,您必须选择最合适的分析仪。
【讨论】: