有人可以解释Lucene内不同分析仪之间的区别吗?我收到了一个maxClauseCount异常,我明白我可以通过使用KeywordAnalyzer来避免这种情况,但我不想在不了解分析器问题的情况下从StandardAnalyzer进行更改。非常感谢。
答案 0 :(得分:206)
通常,Lucene中的任何分析器都是tokenizer + stemmer + stop-words过滤器。
Tokenizer 将文本拆分为块,并且由于不同的分析器可能使用不同的tokenizer,您可以获得不同的输出令牌流,即文本块的序列。例如,您提到的KeywordAnalyzer
根本不拆分文本并将所有字段作为单个标记。同时,StandardAnalyzer
(以及大多数其他分析器)使用空格和标点符号作为分割点。例如,对于短语“我很高兴”,它将产生列表[“i”,“am”,“very”,“happy”](或类似的东西)。有关特定分析器/标记器的更多信息,请参阅其Java Docs。
Stemmers 用于获取相关单词的基础。它在很大程度上取决于使用的语言。例如,对于以前的英语短语,会产生类似[“i”,“be”,“veri”,“happi”]的东西,以及法语“Jesuistrèsheureux”某种法语分析器(如{{用“法语”初始化的3}}将产生[“je”,“être”,“tre”,“heur”]。当然,如果您将使用一种语言的分析器来阻止另一种语言的文本,则将使用来自另一种语言的规则,并且词干分析器可能会产生不正确的结果。并非所有系统都失败,但搜索结果可能不太准确。
KeywordAnalyzer
不使用任何词干分析器,它会在未经修改的情况下传递所有字段。因此,如果您要搜索英文文本中的某些单词,使用此分析器并不是一个好主意。
停用词是最常见且几乎无用的词。同样,它在很大程度上取决于语言。对于英语,这些单词是“a”,“the”,“I”,“be”,“have”等。停用词过滤器从令牌流中删除它们以降低搜索结果中的噪音,所以最后我们的短语“I '{非常高兴'与StandardAnalyzer
将被转换为列表[“veri”,“happi”]。
KeywordAnalyzer
再没有做任何事情。因此,KeywordAnalyzer
用于ID或电话号码等内容,但不适用于通常的文字。
至于你的maxClauseCount
例外,我相信你会在搜索时得到它。在这种情况下,最有可能的原因是搜索查询过于复杂。尝试将其拆分为多个查询或使用更多低级函数。
答案 1 :(得分:0)
在我看来,我曾经使用过StandAnalyzer
和SmartCNAnalyzer
。由于我必须搜索中文文本。显然,SmartCnAnalyzer
更擅长中文。为了达到不同的目的,您必须选择最合适的分析仪。