From 6dfc10859f4647bbd3b00de1d30d3fe507dead07 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Mon, 30 May 2022 01:08:46 +0200 Subject: [PATCH] Implement term fields --- src/main/data-generator/lucene-query.yaml | 1 + .../dbengine/client/query/NoOpAnalyzer.java | 12 +++++++++++ .../dbengine/client/query/QueryParser.java | 21 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 src/main/java/it/cavallium/dbengine/client/query/NoOpAnalyzer.java diff --git a/src/main/data-generator/lucene-query.yaml b/src/main/data-generator/lucene-query.yaml index 731597b..678cea7 100644 --- a/src/main/data-generator/lucene-query.yaml +++ b/src/main/data-generator/lucene-query.yaml @@ -69,6 +69,7 @@ versions: # Should be at least one field! defaultFields: String[] pointsConfig: PointConfig[] + termFields: String[] PointConfig: data: field: String diff --git a/src/main/java/it/cavallium/dbengine/client/query/NoOpAnalyzer.java b/src/main/java/it/cavallium/dbengine/client/query/NoOpAnalyzer.java new file mode 100644 index 0000000..9f328de --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/client/query/NoOpAnalyzer.java @@ -0,0 +1,12 @@ +package it.cavallium.dbengine.client.query; + +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.core.KeywordTokenizer; + +public class NoOpAnalyzer extends Analyzer { + + @Override + protected TokenStreamComponents createComponents(String fieldName) { + return new TokenStreamComponents(new KeywordTokenizer()); + } +} diff --git a/src/main/java/it/cavallium/dbengine/client/query/QueryParser.java b/src/main/java/it/cavallium/dbengine/client/query/QueryParser.java index b93507e..f850d17 100644 --- a/src/main/java/it/cavallium/dbengine/client/query/QueryParser.java +++ b/src/main/java/it/cavallium/dbengine/client/query/QueryParser.java @@ -46,8 +46,20 @@ import it.cavallium.dbengine.client.query.current.data.WildcardQuery; import it.cavallium.dbengine.lucene.RandomSortField; import java.text.DecimalFormat; import java.text.NumberFormat; +import java.util.Map; +import java.util.function.Function; import java.util.stream.Collectors; import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.LowerCaseFilter; +import org.apache.lucene.analysis.StopFilter; +import org.apache.lucene.analysis.TokenStream; +import org.apache.lucene.analysis.Tokenizer; +import org.apache.lucene.analysis.core.KeywordTokenizer; +import org.apache.lucene.analysis.en.EnglishPossessiveFilter; +import org.apache.lucene.analysis.en.PorterStemFilter; +import org.apache.lucene.analysis.miscellaneous.PerFieldAnalyzerWrapper; +import org.apache.lucene.analysis.miscellaneous.SetKeywordMarkerFilter; +import org.apache.lucene.analysis.standard.StandardTokenizer; import org.apache.lucene.document.DoublePoint; import org.apache.lucene.document.FloatPoint; import org.apache.lucene.document.IntPoint; @@ -78,7 +90,16 @@ public class QueryParser { switch (query.getBasicType$()) { case StandardQuery: var standardQuery = (it.cavallium.dbengine.client.query.current.data.StandardQuery) query; + + // Fix the analyzer + Map customAnalyzers = standardQuery + .termFields() + .stream() + .collect(Collectors.toMap(Function.identity(), term -> new NoOpAnalyzer())); + analyzer = new PerFieldAnalyzerWrapper(analyzer, customAnalyzers); + var standardQueryParser = new StandardQueryParser(analyzer); + standardQueryParser.setPointsConfigMap(standardQuery .pointsConfig() .stream()