Add standard lucene queries
This commit is contained in:
parent
3d7e80b4ec
commit
c1c57388e5
9
pom.xml
9
pom.xml
@ -214,6 +214,10 @@
|
||||
<groupId>org.apache.lucene</groupId>
|
||||
<artifactId>lucene-queries</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.lucene</groupId>
|
||||
<artifactId>lucene-queryparser</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.lucene</groupId>
|
||||
<artifactId>lucene-misc</artifactId>
|
||||
@ -406,6 +410,11 @@
|
||||
<artifactId>lucene-queries</artifactId>
|
||||
<version>9.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.lucene</groupId>
|
||||
<artifactId>lucene-queryparser</artifactId>
|
||||
<version>9.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.lucene</groupId>
|
||||
<artifactId>lucene-misc</artifactId>
|
||||
|
@ -12,7 +12,7 @@ versions:
|
||||
BoxedQuery, TermQuery, PhraseQuery, WildcardQuery, SynonymQuery, FuzzyQuery, MatchAllDocsQuery,
|
||||
MatchNoDocsQuery, BooleanQuery, SortedNumericDocValuesFieldSlowRangeQuery, SortedDocFieldExistsQuery,
|
||||
ConstantScoreQuery, BoostQuery, IntPointRangeQuery, LongPointRangeQuery, IntPointExactQuery,
|
||||
LongPointExactQuery
|
||||
LongPointExactQuery, StandardQuery
|
||||
]
|
||||
Occur: [OccurMust, OccurMustNot, OccurShould, OccurFilter]
|
||||
Sort: [NoSort, NumericSort, ScoreSort, DocSort, RandomSort]
|
||||
@ -51,6 +51,16 @@ versions:
|
||||
OccurFilter:
|
||||
data: { }
|
||||
|
||||
# Special queries
|
||||
# ===============
|
||||
|
||||
# Raw lucene string query, parsable by lucene StandardQueryParser
|
||||
StandardQuery:
|
||||
data:
|
||||
query: String
|
||||
# Should be at least one field!
|
||||
defaultFields: String[]
|
||||
|
||||
# Text queries
|
||||
# ============
|
||||
|
||||
|
@ -10,19 +10,24 @@ import it.cavallium.dbengine.client.query.current.data.LongPointExactQuery;
|
||||
import it.cavallium.dbengine.client.query.current.data.LongPointRangeQuery;
|
||||
import it.cavallium.dbengine.client.query.current.data.NumericSort;
|
||||
import it.cavallium.dbengine.client.query.current.data.PhraseQuery;
|
||||
import it.cavallium.dbengine.client.query.current.data.QueryParams;
|
||||
import it.cavallium.dbengine.client.query.current.data.SortedDocFieldExistsQuery;
|
||||
import it.cavallium.dbengine.client.query.current.data.SortedNumericDocValuesFieldSlowRangeQuery;
|
||||
import it.cavallium.dbengine.client.query.current.data.StandardQuery;
|
||||
import it.cavallium.dbengine.client.query.current.data.SynonymQuery;
|
||||
import it.cavallium.dbengine.client.query.current.data.TermAndBoost;
|
||||
import it.cavallium.dbengine.client.query.current.data.TermPosition;
|
||||
import it.cavallium.dbengine.client.query.current.data.TermQuery;
|
||||
import it.cavallium.dbengine.client.query.current.data.WildcardQuery;
|
||||
import it.cavallium.dbengine.lucene.RandomSortField;
|
||||
import org.apache.lucene.analysis.Analyzer;
|
||||
import org.apache.lucene.analysis.standard.StandardAnalyzer;
|
||||
import org.apache.lucene.document.IntPoint;
|
||||
import org.apache.lucene.document.LongPoint;
|
||||
import org.apache.lucene.document.SortedNumericDocValuesField;
|
||||
import org.apache.lucene.index.Term;
|
||||
import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
|
||||
import org.apache.lucene.queryparser.flexible.standard.QueryParserUtil;
|
||||
import org.apache.lucene.queryparser.flexible.standard.StandardQueryParser;
|
||||
import org.apache.lucene.search.BooleanClause.Occur;
|
||||
import org.apache.lucene.search.BooleanQuery.Builder;
|
||||
import org.apache.lucene.search.DocValuesFieldExistsQuery;
|
||||
@ -30,16 +35,31 @@ import org.apache.lucene.search.FuzzyQuery;
|
||||
import org.apache.lucene.search.MatchAllDocsQuery;
|
||||
import org.apache.lucene.search.MatchNoDocsQuery;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.search.ScoreMode;
|
||||
import org.apache.lucene.search.Sort;
|
||||
import org.apache.lucene.search.SortField;
|
||||
import org.apache.lucene.search.SortField.Type;
|
||||
import org.apache.lucene.search.SortedNumericSortField;
|
||||
|
||||
public class QueryParser {
|
||||
public static Query toQuery(it.cavallium.dbengine.client.query.current.data.Query query) {
|
||||
public static Query toQuery(it.cavallium.dbengine.client.query.current.data.Query query, Analyzer analyzer) {
|
||||
if (query == null) return null;
|
||||
switch (query.getBasicType$()) {
|
||||
case StandardQuery:
|
||||
var standardQuery = (it.cavallium.dbengine.client.query.current.data.StandardQuery) query;
|
||||
var standardQueryParser = new StandardQueryParser(analyzer);
|
||||
var defaultFields = standardQuery.defaultFields();
|
||||
try {
|
||||
if (defaultFields.size() > 1) {
|
||||
standardQueryParser.setMultiFields(defaultFields.toArray(String[]::new));
|
||||
return standardQueryParser.parse(standardQuery.query(), null);
|
||||
} else if (defaultFields.size() == 1) {
|
||||
return standardQueryParser.parse(standardQuery.query(), defaultFields.get(0));
|
||||
} else {
|
||||
throw new IllegalStateException("Can't parse a standard query expression that has 0 default fields");
|
||||
}
|
||||
} catch (QueryNodeException e) {
|
||||
throw new IllegalStateException("Can't parse query expression \"" + standardQuery.query() + "\"", e);
|
||||
}
|
||||
case BooleanQuery:
|
||||
var booleanQuery = (it.cavallium.dbengine.client.query.current.data.BooleanQuery) query;
|
||||
var bq = new Builder();
|
||||
@ -51,7 +71,7 @@ public class QueryParser {
|
||||
case OccurMustNot -> Occur.MUST_NOT;
|
||||
default -> throw new IllegalStateException("Unexpected value: " + part.occur().getBasicType$());
|
||||
};
|
||||
bq.add(toQuery(part.query()), occur);
|
||||
bq.add(toQuery(part.query(), analyzer), occur);
|
||||
}
|
||||
bq.setMinimumNumberShouldMatch(booleanQuery.minShouldMatch());
|
||||
return bq.build();
|
||||
@ -66,12 +86,12 @@ public class QueryParser {
|
||||
return new org.apache.lucene.search.TermQuery(toTerm(termQuery.term()));
|
||||
case BoostQuery:
|
||||
var boostQuery = (BoostQuery) query;
|
||||
return new org.apache.lucene.search.BoostQuery(toQuery(boostQuery.query()), boostQuery.scoreBoost());
|
||||
return new org.apache.lucene.search.BoostQuery(toQuery(boostQuery.query(), analyzer), boostQuery.scoreBoost());
|
||||
case ConstantScoreQuery:
|
||||
var constantScoreQuery = (ConstantScoreQuery) query;
|
||||
return new org.apache.lucene.search.ConstantScoreQuery(toQuery(constantScoreQuery.query()));
|
||||
return new org.apache.lucene.search.ConstantScoreQuery(toQuery(constantScoreQuery.query(), analyzer));
|
||||
case BoxedQuery:
|
||||
return toQuery(((BoxedQuery) query).query());
|
||||
return toQuery(((BoxedQuery) query).query(), analyzer);
|
||||
case FuzzyQuery:
|
||||
var fuzzyQuery = (it.cavallium.dbengine.client.query.current.data.FuzzyQuery) query;
|
||||
return new FuzzyQuery(toTerm(fuzzyQuery.term()),
|
||||
|
@ -364,7 +364,7 @@ public class LLLocalLuceneIndex implements LLLuceneIndex {
|
||||
QueryParams queryParams,
|
||||
String keyFieldName,
|
||||
Flux<Tuple2<String, Set<String>>> mltDocumentFieldsFlux) {
|
||||
LocalQueryParams localQueryParams = LuceneUtils.toLocalQueryParams(queryParams);
|
||||
LocalQueryParams localQueryParams = LuceneUtils.toLocalQueryParams(queryParams, luceneAnalyzer);
|
||||
var searcher = this.searcherManager.retrieveSearcher(snapshot);
|
||||
var transformer = new MoreLikeThisTransformer(mltDocumentFieldsFlux);
|
||||
|
||||
@ -378,7 +378,7 @@ public class LLLocalLuceneIndex implements LLLuceneIndex {
|
||||
@Override
|
||||
public Mono<LLSearchResultShard> search(@Nullable LLSnapshot snapshot, QueryParams queryParams,
|
||||
String keyFieldName) {
|
||||
LocalQueryParams localQueryParams = LuceneUtils.toLocalQueryParams(queryParams);
|
||||
LocalQueryParams localQueryParams = LuceneUtils.toLocalQueryParams(queryParams, luceneAnalyzer);
|
||||
var searcher = searcherManager.retrieveSearcher(snapshot);
|
||||
|
||||
return localSearcher
|
||||
|
@ -215,7 +215,7 @@ public class LLLocalMultiLuceneIndex implements LLLuceneIndex {
|
||||
QueryParams queryParams,
|
||||
String keyFieldName,
|
||||
Flux<Tuple2<String, Set<String>>> mltDocumentFields) {
|
||||
LocalQueryParams localQueryParams = LuceneUtils.toLocalQueryParams(queryParams);
|
||||
LocalQueryParams localQueryParams = LuceneUtils.toLocalQueryParams(queryParams, luceneAnalyzer);
|
||||
var searchers = this.getIndexSearchers(snapshot);
|
||||
var transformer = new MultiMoreLikeThisTransformer(mltDocumentFields);
|
||||
|
||||
@ -232,7 +232,7 @@ public class LLLocalMultiLuceneIndex implements LLLuceneIndex {
|
||||
public Mono<LLSearchResultShard> search(@Nullable LLSnapshot snapshot,
|
||||
QueryParams queryParams,
|
||||
String keyFieldName) {
|
||||
LocalQueryParams localQueryParams = LuceneUtils.toLocalQueryParams(queryParams);
|
||||
LocalQueryParams localQueryParams = LuceneUtils.toLocalQueryParams(queryParams, luceneAnalyzer);
|
||||
var searchers = getIndexSearchers(snapshot);
|
||||
|
||||
// Collect all the shards results into a single global result
|
||||
|
@ -340,8 +340,8 @@ public class LuceneUtils {
|
||||
return scoreDocs[scoreDocs.length - 1];
|
||||
}
|
||||
|
||||
public static LocalQueryParams toLocalQueryParams(QueryParams queryParams) {
|
||||
return new LocalQueryParams(QueryParser.toQuery(queryParams.query()),
|
||||
public static LocalQueryParams toLocalQueryParams(QueryParams queryParams, Analyzer analyzer) {
|
||||
return new LocalQueryParams(QueryParser.toQuery(queryParams.query(), analyzer),
|
||||
queryParams.offset(),
|
||||
queryParams.limit(),
|
||||
DEFAULT_PAGE_LIMITS,
|
||||
|
Loading…
x
Reference in New Issue
Block a user