Lucene分析仪的比较


104

有人可以解释一下Lucene中不同分析仪之间的区别吗?我遇到了maxClauseCount异常,并且我知道可以通过使用KeywordAnalyzer避免这种情况,但是我不想在不了解分析器相关问题的情况下从StandardAnalyzer进行更改。非常感谢。

Answers:


209

通常,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例外情况,我相信您可以通过搜索获得。在这种情况下,很可能是因为搜索查询太复杂。尝试将其拆分为多个查询或使用更多的低级功能。


1
@ffriend:我认为Stemmer(使用雪球或其他算法)不能转换am->是因为这是Lemmatizer的工作。您可以在此处查看snowball.tartarus.org/demo.php
2015年

那么,蒂卡适合什么呢?从技术上讲它不是分析仪吗?
2015年

1
@anon:Tika是一个独立的项目,具有多个关键功能。假设您的意思是Tika解析器,我想说Tika使用字节流并输出文本+元数据,而Lucene分析器则使用文本并输出处理后的令牌流。例如,您可以首先使用Tika解析PDF或XML文件,生成包含“ title”,“ author”和“ text”等字段的文档,然后使用Lucene分析器分析其中的某些或全部字段。
ffriend 2015年

只是想知道,“非常”和“快乐”不是拒绝的词,为什么它们变成“非常”和“幸福”?匹配i <-> y的差异,因为它们听起来相似吗?
oguzalb

0

在我看来,我曾经使用StandAnalyzerSmartCNAnalyzer。由于我必须搜索中文文本。显然,SmartCnAnalyzer比较擅长中文。为了实现不同的目的,您必须选择最合适的分析仪。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.