001
014
015 package com.liferay.portal.search.lucene;
016
017 import java.io.IOException;
018 import java.io.Reader;
019
020 import java.util.HashMap;
021 import java.util.Map;
022 import java.util.regex.Pattern;
023
024 import org.apache.lucene.analysis.Analyzer;
025 import org.apache.lucene.analysis.TokenStream;
026 import org.apache.lucene.document.Fieldable;
027
028
032 public class PerFieldAnalyzer extends Analyzer {
033
034 public PerFieldAnalyzer(
035 Analyzer defaultAnalyzer, Map<String, Analyzer> analyzerMap) {
036
037 _analyzer = defaultAnalyzer;
038 _analyzers = analyzerMap;
039 }
040
041 public void addAnalyzer(String fieldName, Analyzer analyzer) {
042 _analyzers.put(fieldName, analyzer);
043 }
044
045 public Analyzer getAnalyzer(String fieldName) {
046 Analyzer analyzer = _analyzers.get(fieldName);
047
048 if (analyzer != null) {
049 return analyzer;
050 }
051
052 for (String key : _analyzers.keySet()) {
053 if (Pattern.matches(key, fieldName)) {
054 return _analyzers.get(key);
055 }
056 }
057
058 return _analyzer;
059 }
060
061 @Override
062 public int getOffsetGap(Fieldable field) {
063 Analyzer analyzer = getAnalyzer(field.name());
064
065 return analyzer.getOffsetGap(field);
066 }
067
068 @Override
069 public int getPositionIncrementGap(String fieldName) {
070 Analyzer analyzer = getAnalyzer(fieldName);
071
072 return analyzer.getPositionIncrementGap(fieldName);
073 }
074
075 @Override
076 public TokenStream reusableTokenStream(String fieldName, Reader reader)
077 throws IOException {
078
079 Analyzer analyzer = getAnalyzer(fieldName);
080
081 return analyzer.reusableTokenStream(fieldName, reader);
082 }
083
084 @Override
085 public TokenStream tokenStream(String fieldName, Reader reader) {
086 Analyzer analyzer = getAnalyzer(fieldName);
087
088 return analyzer.tokenStream(fieldName, reader);
089 }
090
091 private Analyzer _analyzer;
092 private Map<String, Analyzer> _analyzers = new HashMap<String, Analyzer>();
093
094 }