Can someone please explain the difference between the different analyzers within Lucene? I am getting a maxClauseCount exception and I understand that I can avoid this by using a KeywordAnalyzer but I don't want to change from the StandardAnalyzer without understanding the issues surrounding analyzers. Thanks very much.
2 回答
一般来说,Lucene 中的任何分析器都是分词器 + 词干分析器 + 停用词过滤器。
Tokenizer将你的文本分割成块,并且由于不同的分析器可能使用不同的 tokenizer,你可以获得不同的输出标记流,即文本块的序列。例如,KeywordAnalyzer
您提到的根本不拆分文本并将所有字段作为单个标记。同时,StandardAnalyzer
(和大多数其他分析器)使用空格和标点符号作为分割点。例如,对于短语“我很高兴”,它将产生列表 [“i”、“am”、“very”、“happy”](或类似的东西)。有关特定分析器/标记器的更多信息,请参阅其Java Docs。
词干用于获取相关单词的基础。这在很大程度上取决于所使用的语言。例如,对于英文中的前一个短语,会产生类似 ["i", "be", "veri", "happi"] 的东西,而对于法语 "Je suis très heureux" 会产生某种法语分析器(例如SnowballAnalyzer
,初始化使用 "French") 将产生 ["je", "être", "tre", "heur"]。当然,如果您将使用一种语言的分析器来提取另一种语言的文本,则将使用另一种语言的规则,并且词干分析器可能会产生错误的结果。并非所有系统都失败,但搜索结果可能不太准确。
KeywordAnalyzer
不使用任何词干分析器,它通过所有未修改的字段。所以,如果你要在英文文本中搜索一些单词,使用这个分析器不是一个好主意。
停用词是最常见且几乎无用的词。同样,它在很大程度上取决于语言。对于英语,这些词是“a”、“the”、“I”、“be”、“have”等。停用词过滤器将它们从标记流中删除以降低搜索结果中的噪音,所以最后我们的短语“I 'm very happy" withStandardAnalyzer
将被转换为列表 ["veri", "happi"]。
再KeywordAnalyzer
一次什么也不做。因此,KeywordAnalyzer
用于 ID 或电话号码之类的内容,但不适用于通常的文本。
至于你的maxClauseCount
例外,我相信你会在搜索中得到它。在这种情况下,很可能是因为搜索查询过于复杂。尝试将其拆分为多个查询或使用更多低级函数。
在我看来,我使用过StandAnalyzer
and SmartCNAnalyzer
。因为我必须用中文搜索文本。显然,SmartCnAnalyzer
更擅长处理中文。出于不同的目的,您必须选择最合适的分析仪。