Answers:
通常,Lucene中的任何分析器都是标记器+词干分析器+停用词过滤器。
标记生成器将您的文本块,并且由于不同的分析仪可以使用不同的断词,就可以得到不同的输出记号流,即文本块的序列。例如,KeywordAnalyzer
您提到根本不分割文本,而是将所有字段作为单个标记。同时,StandardAnalyzer
(和大多数其他分析器)将空格和标点符号用作拆分点。例如,对于短语“我很高兴”,它将产生列表[“ i”,“ am”,“非常”,“高兴”](或类似的东西)。有关特定分析器/令牌的更多信息,请参见其Java Docs。
词干用于获取有问题的单词的基数。在很大程度上取决于所使用的语言。例如,对于英语中的先前短语,将产生类似[“ i”,“ be”,“ veri”,“ happi”]的内容,而对于法语“ Je suistrèsheureux”则是某种法语分析器(例如SnowballAnalyzer
,已初始化与“法语”)将产生[“ je”,“être”,“ tre”,“ heur”]。当然,如果您将使用一种语言的分析器来提取另一种语言的文本,则将使用另一种语言的规则,并且词干分析器可能会产生错误的结果。并非所有系统都失败,但是搜索结果可能不太准确。
KeywordAnalyzer
不使用任何词干分析器,它将通过所有未修改的字段。因此,如果您要搜索英文文本中的某些单词,那么使用此分析仪不是一个好主意。
停用词是最常见且几乎没有用的词。同样,它在很大程度上取决于语言。对于英语,这些单词是“ a”,“ the”,“ I”,“ be”,“ have”等。停用词过滤器将它们从令牌流中删除,以降低搜索结果中的噪音,因此最终我们的短语“ I” “非常高兴” StandardAnalyzer
将转换为列表[“ veri”,“ happi”]。
并KeywordAnalyzer
再次什么都不做。因此,KeywordAnalyzer
用于ID或电话号码之类的东西,但不用于普通文本。
至于您的maxClauseCount
例外情况,我相信您可以通过搜索获得。在这种情况下,很可能是因为搜索查询太复杂。尝试将其拆分为多个查询或使用更多的低级功能。