From 96e38eca6183646c77d4fde99eec457b22e5df4b Mon Sep 17 00:00:00 2001 From: barsk Date: Tue, 28 Feb 2012 13:57:54 +0100 Subject: [PATCH] Exposing filtering capabilities via the unicodeSetFilter attribute --- .../IcuFoldingTokenFilterFactory.java | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/elasticsearch/index/analysis/IcuFoldingTokenFilterFactory.java b/src/main/java/org/elasticsearch/index/analysis/IcuFoldingTokenFilterFactory.java index ed11a227dcf..f543654dbc3 100644 --- a/src/main/java/org/elasticsearch/index/analysis/IcuFoldingTokenFilterFactory.java +++ b/src/main/java/org/elasticsearch/index/analysis/IcuFoldingTokenFilterFactory.java @@ -1,8 +1,8 @@ /* - * Licensed to ElasticSearch and Shay Banon under one + * Licensed to Elastic Search and Shay Banon under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information - * regarding copyright ownership. ElasticSearch licenses this + * regarding copyright ownership. Elastic Search licenses this * file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at @@ -27,19 +27,46 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.Index; import org.elasticsearch.index.settings.IndexSettings; +import com.ibm.icu.text.FilteredNormalizer2; +import com.ibm.icu.text.Normalizer2; +import com.ibm.icu.text.UnicodeSet; + /** + * Uses the {@link org.apache.lucene.analysis.icu.ICUFoldingFilter}. + * Applies foldings from UTR#30 Character Foldings. + *

+ * Can be filtered to handle certain characters in a specified way (see http://icu-project.org/apiref/icu4j/com/ibm/icu/text/UnicodeSet.html) + * E.g national chars that should be retained (filter : "[^åäöÅÄÖ]"). * + *

The unicodeSetFilter attribute can be used to provide the UniCodeSet for filtering. + * + * @author kimchy (shay.banon) */ public class IcuFoldingTokenFilterFactory extends AbstractTokenFilterFactory { + private final String unicodeSetFilter; - @Inject - public IcuFoldingTokenFilterFactory(Index index, @IndexSettings Settings indexSettings, @Assisted String name, @Assisted Settings settings) { + @Inject public IcuFoldingTokenFilterFactory(Index index, @IndexSettings Settings indexSettings, @Assisted String name, @Assisted Settings settings) { super(index, indexSettings, name, settings); + this.unicodeSetFilter = settings.get("unicodeSetFilter"); } - @Override - public TokenStream create(TokenStream tokenStream) { - return new ICUFoldingFilter(tokenStream); + @Override public TokenStream create(TokenStream tokenStream) { + + // The ICUFoldingFilter is in fact implemented as a ICUNormalizer2Filter. + // ICUFoldingFilter lacks a constructor for adding filtering so we implemement it here + if (unicodeSetFilter != null) { + Normalizer2 base = Normalizer2.getInstance( + ICUFoldingFilter.class.getResourceAsStream("utr30.nrm"), + "utr30", Normalizer2.Mode.COMPOSE); + UnicodeSet unicodeSet = new UnicodeSet(unicodeSetFilter); + + unicodeSet.freeze(); + Normalizer2 filtered = new FilteredNormalizer2(base, unicodeSet); + return new org.apache.lucene.analysis.icu.ICUNormalizer2Filter(tokenStream, filtered); + } + else { + return new ICUFoldingFilter(tokenStream); + } } } \ No newline at end of file