我正在使用Lucene进行Java练习。我想删除";{〃;以及"在CustomAnalyzer中使用CharFilter,但我不知道如何调用";PatternReplaceCharFilterFactory";。我试着称之为"传递";地图";但它不起作用,并返回一个异常。我也试过用图案";p〃;但它是一样的。
public static ArrayList<String> analyzer_codigo(String texto)throws IOException{
Map<String, String> map = new HashMap<String, String>();
map.put("{", "");
map.put("}", "");
map.put(";", "");
Pattern p = Pattern.compile("([^a-z])");
boolean replaceAll = Boolean.TRUE;
Reader r = new Reader(texto);
Analyzer ana = CustomAnalyzer.builder(Paths.get("."))
.addCharFilter(PatternReplaceCharFilterFactory.class,p,"",r)
.withTokenizer(StandardTokenizerFactory.class)
.addTokenFilter(LowerCaseFilterFactory.class)
.build();
return muestraTexto(ana, texto);
}
您可以将Map
传递给PatternReplaceCharFilterFactory
,但用于映射的键是在JavaDoc中为工厂类定义的键:
pattern="([^a-z])" replacement=""
这使用Solr文档来定义密钥(pattern
和replacement
(及其Solr默认值。
使用这些键,您的地图将变为:
Map<String, String> map = new HashMap<>();
map.put("pattern", "\{|\}|;");
map.put("replacement", "");
正则表达式\{|\}|;
需要对{
和}
字符进行转义,因为它们具有特殊含义,然后正则表达式反斜杠也需要在Java字符串中进行转义。
因此,上面的正则表达式意味着{
和}
以及;
都将被空字符串替换。
然后您的自定义分析器变成:
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer(StandardTokenizerFactory.NAME)
.addCharFilter(PatternReplaceCharFilterFactory.NAME, map)
.addTokenFilter(LowerCaseFilterFactory.NAME)
.build();
如果您使用它来索引以下输入字符串:
foo{bar}baz;bat
然后索引值将存储为:
foobarbazbat
非常小的一点:我更喜欢使用PatternReplaceCharFilterFactory.NAME
而不是PatternReplaceCharFilterFactory.class
,甚至只使用"patternReplace"
,但这些都有效。
更新
只是为了完整性:
CCD_ 15支持添加CCD_ 16的不同方式。参见其addCharFilter
方法。
除了上述方法外,使用Map
。。。
.addCharFilter(PatternReplaceCharFilterFactory.NAME, map)
您也可以使用Java varargs:
"key1", "value1", "key2", "value2", ...
因此,在我们的情况下,这将是:
.addCharFilter(PatternReplaceCharFilterFactory.NAME
"pattern", "\{|\}|;", "replacement", "")