X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.indexing%2Fsrc%2Forg%2Fsimantics%2Fdb%2Findexing%2FQueries.java;h=eab6a7a121d283adf10f88e95cce33efe3ca539d;hb=ad0e5bf4b34705988e23c9ee3f8e4fcbb760c701;hp=21a25d7d63a79caba3742c5457005222d3845e3b;hpb=3c524553c98b56075d854f355bc7bab2e3ae17f7;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/Queries.java b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/Queries.java index 21a25d7d6..eab6a7a12 100644 --- a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/Queries.java +++ b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/Queries.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.simantics.db.indexing; +import java.io.IOException; import java.io.Reader; import java.util.HashMap; import java.util.Map; @@ -20,12 +21,14 @@ import java.util.regex.Pattern; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenFilter; +import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.Tokenizer; import org.apache.lucene.analysis.core.KeywordAnalyzer; import org.apache.lucene.analysis.core.WhitespaceAnalyzer; import org.apache.lucene.analysis.miscellaneous.PerFieldAnalyzerWrapper; import org.apache.lucene.analysis.pattern.PatternReplaceFilter; import org.apache.lucene.analysis.pattern.PatternTokenizer; +import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.util.CharTokenizer; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; @@ -34,6 +37,7 @@ import org.apache.lucene.search.Query; import org.apache.lucene.util.AttributeFactory; import org.apache.lucene.util.Version; import org.simantics.databoard.util.ObjectUtils; +import org.simantics.db.layer0.genericrelation.Dependencies; import org.simantics.utils.datastructures.Pair; public class Queries { @@ -94,14 +98,35 @@ public class Queries { } } + final static class LowercaseFilter extends TokenFilter { + private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); + + public LowercaseFilter(TokenStream in) { + super(in); + } + + @Override + public boolean incrementToken() throws IOException { + if (!input.incrementToken()) return false; + String lowercase = termAtt.toString().toLowerCase(); + termAtt.setEmpty().append(lowercase); + return true; + } + } + static final class TypeStringAnalyzer extends Analyzer { + private boolean lowercase; - @Override - protected TokenStreamComponents createComponents(String fieldName, Reader reader) { + public TypeStringAnalyzer(Boolean lowercase) { + this.lowercase = lowercase; + } + + @Override + protected TokenStreamComponents createComponents(String fieldName, Reader reader) { Tokenizer tokenizer = new PatternTokenizer(reader, Pattern.compile("(([^\\\\ ]|\\\\\\\\|\\\\ )+)( *)"), 1); TokenFilter filter = new PatternReplaceFilter(tokenizer, Pattern.compile("(\\\\(\\\\| ))"), "$2", true); - return new TokenStreamComponents(tokenizer, filter); + return new TokenStreamComponents(tokenizer, lowercase ? new LowercaseFilter(filter) : filter); } } @@ -111,18 +136,21 @@ public class Queries { final static PerFieldAnalyzerWrapper analyzer = createAnalyzer(); static PerFieldAnalyzerWrapper createAnalyzer() { - - Map analyzerPerField = new HashMap<>(); - analyzerPerField.put("Model", new KeywordAnalyzer()); - analyzerPerField.put("Parent", new KeywordAnalyzer()); - analyzerPerField.put("Resource", new KeywordAnalyzer()); - analyzerPerField.put("GUID", new KeywordAnalyzer()); - analyzerPerField.put("Name", new KeywordAnalyzer()); - analyzerPerField.put("Types", new TypeStringAnalyzer()); - + + Map analyzerPerField = new HashMap<>(); + analyzerPerField.put(Dependencies.FIELD_MODEL, new KeywordAnalyzer()); + analyzerPerField.put(Dependencies.FIELD_PARENT, new KeywordAnalyzer()); + analyzerPerField.put(Dependencies.FIELD_RESOURCE, new KeywordAnalyzer()); + analyzerPerField.put(Dependencies.FIELD_GUID, new KeywordAnalyzer()); + analyzerPerField.put(Dependencies.FIELD_NAME, new KeywordAnalyzer()); + analyzerPerField.put(Dependencies.FIELD_TYPES, new TypeStringAnalyzer(false)); + analyzerPerField.put(Dependencies.FIELD_NAME_SEARCH, new LowerCaseWhitespaceAnalyzer(Version.LUCENE_4_9)); + analyzerPerField.put(Dependencies.FIELD_TYPES_SEARCH, new TypeStringAnalyzer(true)); + analyzerPerField.put(Dependencies.FIELD_TYPE_RESOURCE, new WhitespaceAnalyzer(Version.LUCENE_4_9)); + PerFieldAnalyzerWrapper analyzer = new PerFieldAnalyzerWrapper(new LowerCaseWhitespaceAnalyzer(Version.LUCENE_4_9), analyzerPerField); return analyzer; - + } static PerFieldAnalyzerWrapper getAnalyzer() {