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
031 public class PerFieldAnalyzer extends Analyzer {
032
033 public PerFieldAnalyzer(
034 Analyzer defaultAnalyzer, Map<String, Analyzer> analyzerMap) {
035
036 _analyzer = defaultAnalyzer;
037 _analyzers = analyzerMap;
038 }
039
040 public void addAnalyzer(String fieldName, Analyzer analyzer) {
041 _analyzers.put(fieldName, analyzer);
042 }
043
044 public Analyzer getAnalyzer(String fieldName) {
045 Analyzer analyzer = _analyzers.get(fieldName);
046
047 if (analyzer != null) {
048 return analyzer;
049 }
050
051 for (String key : _analyzers.keySet()) {
052 if (Pattern.matches(key, fieldName)) {
053 return _analyzers.get(key);
054 }
055 }
056
057 return _analyzer;
058 }
059
060 @Override
061 public int getOffsetGap(Fieldable field) {
062 Analyzer analyzer = getAnalyzer(field.name());
063
064 return analyzer.getOffsetGap(field);
065 }
066
067 @Override
068 public int getPositionIncrementGap(String fieldName) {
069 Analyzer analyzer = getAnalyzer(fieldName);
070
071 return analyzer.getPositionIncrementGap(fieldName);
072 }
073
074 @Override
075 public TokenStream reusableTokenStream(String fieldName, Reader reader)
076 throws IOException {
077
078 Analyzer analyzer = getAnalyzer(fieldName);
079
080 return analyzer.reusableTokenStream(fieldName, reader);
081 }
082
083 @Override
084 public TokenStream tokenStream(String fieldName, Reader reader) {
085 Analyzer analyzer = getAnalyzer(fieldName);
086
087 return analyzer.tokenStream(fieldName, reader);
088 }
089
090 private Analyzer _analyzer;
091 private Map<String, Analyzer> _analyzers = new HashMap<String, Analyzer>();
092
093 }