Lucene搜索特殊字符

时间:2015-07-22 12:47:05

标签: java lucene

在我的Lucene索引中,我将具有特殊字符的名称(例如Savić)存储在如下所述的字段中。

FieldType fieldType = new Field();
fieldType.setStored(true);
fieldType.setIndexed(true);
fieldType.setTokenized(false);<br>
new Field("NAME", "Savić".toLowerCase(), fieldType);

我使用的是StopwordAnalyzerBase分析器和Lucene Version.LUCENE_45。

如果我在现场搜索“savić”,它就找不到了。如何处理特殊字符?

@Override
protected TokenStreamComponents createComponents(final String fieldName, final Reader reader) {
PatternTokenizer src;
// diese Zeichen werden nicht als Trenner verwendet
src = new PatternTokenizer(reader, Pattern.compile("[\\W&&[^§/_&äÄöÖüÜßéèàáîâêûôëïñõãçœ◊]]"), -1);

TokenStream tok = new StandardFilter(matchVersion, src);
tok = new LowerCaseFilter(matchVersion, tok);
tok = new StopFilter(matchVersion, tok, TRIBUNA_WORDS_SET);

return new TokenStreamComponents(src, tok) {
    @Override
    protected void setReader(final Reader reader) throws IOException {
        super.setReader(reader);
    }
};

}

1 个答案:

答案 0 :(得分:0)

您有几个选择:

  1. 尝试添加ASCIIFoldingFilter

    src = new PatternTokenizer(reader, Pattern.compile("[\\W&&[^§/_&äÄöÖüÜßéèàáîâêûôëïñõãçœ◊]]"), -1);
    
    TokenStream tok = new StandardFilter(matchVersion, src);
    tok = new LowerCaseFilter(matchVersion, tok);
    tok = new ASCIIFoldingFilter(tok);
    tok = new StopFilter(matchVersion, tok, TRIBUNA_WORDS_SET);
    

    如果存在合理的ASCII替代字符,这将采用相当简单的方法将非ASCII字符(例如Ä)减少到ASCII字符(在本例中为A)中的最佳匹配。尝试使用特定语言的智能来确定最佳替代品时,它不会做任何事情。

  2. 对于更具语言智能性的东西,有许多工具可以在许多特定于语言的包中处理这类事情。 GermanNormalizationFilter将是一个示例,它将执行与ASCIIFoldingFilter类似的操作,但将以适合德语的方式应用规则,例如'ß'被'ss'替换。您将使用它与上面的代码类似:

    src = new PatternTokenizer(reader, Pattern.compile("[\\W&&[^§/_&äÄöÖüÜßéèàáîâêûôëïñõãçœ◊]]"), -1);
    
    TokenStream tok = new StandardFilter(matchVersion, src);
    tok = new LowerCaseFilter(matchVersion, tok);
    tok = new GermanNormalizationFilter(tok);
    tok = new StopFilter(matchVersion, tok, TRIBUNA_WORDS_SET);