Lucene(java)中的PatternPlaceCharFilterFactory参数问题



我正在使用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文档来定义密钥(patternreplacement(及其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", "")

相关内容

  • 没有找到相关文章

最新更新