使用Solr WordDelimiterFilter时出现问题
我正在Solr中使用WordDelimiterFilter进行一些测试,但它没有保留我传递给它的受保护的单词列表。请检查代码和输出示例,并建议缺少或使用不当的部分 运行此代码时:使用Solr WordDelimiterFilter时出现问题,filter,lucene,solr,tokenize,analyzer,Filter,Lucene,Solr,Tokenize,Analyzer,我正在Solr中使用WordDelimiterFilter进行一些测试,但它没有保留我传递给它的受保护的单词列表。请检查代码和输出示例,并建议缺少或使用不当的部分 运行此代码时: private static Analyzer getWordDelimiterAnalyzer() { return new Analyzer() { @Override public TokenStream tokenStream(String fieldName, Read
private static Analyzer getWordDelimiterAnalyzer() {
return new Analyzer() {
@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
TokenStream stream = new StandardTokenizer(Version.LUCENE_32, reader);
WordDelimiterFilterFactory wordDelimiterFilterFactory = new WordDelimiterFilterFactory();
HashMap<String, String> args = new HashMap<String, String>();
args.put("generateWordParts", "1");
args.put("generateNumberParts", "1");
args.put("catenateWords", "1");
args.put("catenateNumbers", "1");
args.put("catenateAll", "0");
args.put("luceneMatchVersion", Version.LUCENE_32.name());
args.put("language", "English");
args.put("protected", "protected.txt");
wordDelimiterFilterFactory.init(args);
ResourceLoader loader = new SolrResourceLoader(null, null);
wordDelimiterFilterFactory.inform(loader);
/*List<String> protectedWords = new ArrayList<String>();
protectedWords.add("good bye");
protectedWords.add("hello world");
wordDelimiterFilterFactory.inform(new LinesMockSolrResourceLoader(protectedWords));
*/
return wordDelimiterFilterFactory.create(stream);
}
};
}
输入文本:
你好,世界
再见
你对未来的计划是什么?
受保护字符串:
再见
你好,世界
输出:
您好,startOffset=0,endOffset=5,positionIncrement=1,键入=
world,startOffset=6,endOffset=11,positionIncrement=1,类型=
好,开始设置=12,内偏移=16,位置增量=1,类型=
再见,startOffset=17,endOffset=20,positionIncrement=1,类型=
什么,startOffset=21,endOffset=25,positionIncrement=1,类型=
是,startOffset=26,endOffset=28,positionIncrement=1,类型=
您的,startOffset=29,endOffset=33,positionIncrement=1,键入=
计划,开始设置=34,结束偏移=38,位置增量=1,类型=
对于,startOffset=39,endOffset=42,positionIncrement=1,类型=
将来,startOffset=43,endOffset=49,positionIncrement=1,type=您使用的是一个标准标记器,它至少在空白级别上进行标记,因此您将始终将hello-world拆分为hello和world
TokenStream stream = new StandardTokenizer(Version.LUCENE_32, reader);
参见Lucene文档:
公共最终类标准标记器扩展标记器
用JFlex构造的基于语法的标记器
对于大多数欧洲语言文档来说,这应该是一个很好的标记器:
在标点符号处拆分单词,删除标点符号。
但是,不后跟空格的点被视为
代币
在中以连字符分隔单词,除非标记中有数字
在这种情况下,整个令牌被解释为产品编号,并且
不分裂
将电子邮件地址和internet主机名识别为一个令牌
单词分隔符受保护的单词列表用于以下内容:
ISBN2345677将拆分为ISBN 2345677
text2html不能拆分为text2html,因为text2html已添加到受保护的单词中
如果你真的想做你提到的事情,你可以使用关键字标记器。但是您必须自己完成完整的拆分。非常感谢,似乎我要求的功能与WordDelimiterFilter的预期功能不同。关键字标记器将整个文本作为单个标记发出。这不是我想要的,是否有任何过滤器或标记器可以保护包含空格的关键字不被分割?您可以看看CommonGramsFilterFactor。