使用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

我正在Solr中使用WordDelimiterFilter进行一些测试,但它没有保留我传递给它的受保护的单词列表。请检查代码和输出示例,并建议缺少或使用不当的部分

运行此代码时:

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。