package folioxml.lucene; import folioxml.core.InvalidMarkupException; import folioxml.core.TokenUtils; import folioxml.lucene.analysis.AnalyzerPicker; import folioxml.lucene.analysis.ListAnalyzer; import folioxml.lucene.analysis.LowercaseKeywordAnalyzer; import folioxml.xml.Node; import folioxml.xml.XmlRecord; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import java.util.TreeMap; public class InfobaseFieldOptsSet implements IndexFieldOptsProvider, AnalyzerPicker { public InfobaseFieldOptsSet(XmlRecord root) throws InvalidMarkupException { fields.put("groups", new IndexFieldOpts(new ListAnalyzer())); fields.put("bookmarks", new IndexFieldOpts(new ListAnalyzer())); fields.put("folioSectionHeading", new IndexFieldOpts(new LowercaseKeywordAnalyzer())); //<style-def type="field" fieldType="text|date|time|integer|decimal" format="[format string]" class="field name" indexOptions="TF,PF,TE,NO,PR,DT,FP,SW" /> for (Node t : root.children.filterByTagName("style-def", true).list()) { if (TokenUtils.fastMatches("field", t.get("type"))) { IndexFieldOpts indexOpts = getOptions(t); String fieldName = t.get("styleName"); if (indexOpts != null && !fields.containsKey(fieldName)) { fields.put(fieldName, indexOpts); } } } } private IndexFieldOpts getOptions(Node t) throws InvalidMarkupException { if (!TokenUtils.fastMatches("text", t.get("fieldType"))) return null; //We only parse text indexing fields right now. Others aren't implemented yet. //Split the options String sOpts = t.get("indexOptions"); return new IndexFieldOpts((sOpts == null) ? new String[]{} : sOpts.split(",")); } IndexFieldOpts defaultOpts = new IndexFieldOpts(new StandardAnalyzer()); Analyzer textContentsAnalyzer = new StandardAnalyzer(); public TreeMap<String, IndexFieldOpts> fields = new TreeMap<String, IndexFieldOpts>(String.CASE_INSENSITIVE_ORDER); @Override public IndexFieldOpts getFieldOptions(String fieldName) { if (fields.containsKey(fieldName)) { IndexFieldOpts a = fields.get(fieldName); if (a != null) return a; } return defaultOpts; } @Override public String getDefaultField() { return "contents"; } public static String getStaticDefaultField() { return "contents"; } public Analyzer getAnalyzer(String fieldName) { if (fieldName.equals(getDefaultField())) return textContentsAnalyzer; if (fields.containsKey(fieldName)) { Analyzer a = fields.get(fieldName).fieldAnalyzer; if (a != null) return a; } return defaultOpts.fieldAnalyzer; } }