我最近注意到自3.1版以来Lucene StandardAnalyzer的行为有所改变。具体而言,3.0及以前版本将电子邮件,IP地址,公司名称等识别为单独的词汇类型,而后来的版本则不然。
例如,对于输入文本:“ example@mail.com 127.0.0.1 H& M ”,3.0分析器将识别以下类型:
1:example@mail.com:0-> 16:< EMAIL >
2:127.0.0.1:17-> 26:< HOST >
3:h& m:27-> 30:< COMPANY >
但是,版本3.1及更高版本为相同的输入文本提供以下输出:
1:示例:0-> 7:< ALPHANUM >
2:mail.com:8-> 16:< ALPHANUM >
3:127.0.0.1:17-> 26:< NUM >
我的问题是,如何使用较新版本的Lucene库实现旧的StandardAnalyzer行为?是否有一些标准的TokenFilter可以帮助我实现这一目标,还是需要实现自定义过滤器?
答案 0 :(得分:1)
请参阅StandardAnalyzer的javadoc:从3.1开始,StandardTokenizer实现了Unicode文本分段.... ClassicTokenizer和ClassicAnalyzer是StandardTokenizer和StandardAnalyzer的3.1之前的实现。
或者,您可以将LUCENE_30版本传递给StandardAnalyzer,您也可以获得之前的行为。这就是这些版本常量的目的,因此行为对于现有用户保持一致,并且您决定何时将应用程序升级为更改的行为。