use of org.apache.lucene.queries.function.BoostedQuery in project lucene-solr by apache.
the class BoostQParserPlugin method createParser.
@Override
public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
return new QParser(qstr, localParams, params, req) {
QParser baseParser;
ValueSource vs;
String b;
@Override
public Query parse() throws SyntaxError {
b = localParams.get(BOOSTFUNC);
baseParser = subQuery(localParams.get(QueryParsing.V), null);
Query q = baseParser.getQuery();
if (b == null)
return q;
Query bq = subQuery(b, FunctionQParserPlugin.NAME).getQuery();
if (bq instanceof FunctionQuery) {
vs = ((FunctionQuery) bq).getValueSource();
} else {
vs = new QueryValueSource(bq, 0.0f);
}
return new BoostedQuery(q, vs);
}
@Override
public String[] getDefaultHighlightFields() {
return baseParser.getDefaultHighlightFields();
}
@Override
public Query getHighlightQuery() throws SyntaxError {
return baseParser.getHighlightQuery();
}
@Override
public void addDebugInfo(NamedList<Object> debugInfo) {
// encapsulate base debug info in a sub-list?
baseParser.addDebugInfo(debugInfo);
debugInfo.add("boost_str", b);
debugInfo.add("boost_parsed", vs);
}
};
}
use of org.apache.lucene.queries.function.BoostedQuery in project lucene-solr by apache.
the class ExtendedDismaxQParser method parse.
@Override
public Query parse() throws SyntaxError {
parsed = true;
/* the main query we will execute. we disable the coord because
* this query is an artificial construct
*/
BooleanQuery.Builder query = new BooleanQuery.Builder();
/* * * Main User Query * * */
parsedUserQuery = null;
String userQuery = getString();
altUserQuery = null;
if (userQuery == null || userQuery.trim().length() == 0) {
// If no query is specified, we may have an alternate
if (config.altQ != null) {
QParser altQParser = subQuery(config.altQ, null);
altUserQuery = altQParser.getQuery();
query.add(altUserQuery, BooleanClause.Occur.MUST);
} else {
return null;
// throw new SyntaxError("missing query string" );
}
} else {
// There is a valid query string
ExtendedSolrQueryParser up = createEdismaxQueryParser(this, IMPOSSIBLE_FIELD_NAME);
up.addAlias(IMPOSSIBLE_FIELD_NAME, config.tiebreaker, config.queryFields);
addAliasesFromRequest(up, config.tiebreaker);
// slop for explicit user phrase queries
up.setPhraseSlop(config.qslop);
up.setAllowLeadingWildcard(true);
// defer escaping and only do if lucene parsing fails, or we need phrases
// parsing fails. Need to sloppy phrase queries anyway though.
List<Clause> clauses = splitIntoClauses(userQuery, false);
// Always rebuild mainUserQuery from clauses to catch modifications from splitIntoClauses
// This was necessary for userFields modifications to get propagated into the query.
// Convert lower or mixed case operators to uppercase if we saw them.
// only do this for the lucene query part and not for phrase query boosting
// since some fields might not be case insensitive.
// We don't use a regex for this because it might change and AND or OR in
// a phrase query in a case sensitive field.
String mainUserQuery = rebuildUserQuery(clauses, config.lowercaseOperators);
// but always for unstructured implicit bqs created by getFieldQuery
up.minShouldMatch = config.minShouldMatch;
up.setSplitOnWhitespace(config.splitOnWhitespace);
parsedUserQuery = parseOriginalQuery(up, mainUserQuery, clauses, config);
if (parsedUserQuery == null) {
parsedUserQuery = parseEscapedQuery(up, escapeUserQuery(clauses), config);
}
query.add(parsedUserQuery, BooleanClause.Occur.MUST);
addPhraseFieldQueries(query, clauses, config);
}
/* * * Boosting Query * * */
boostQueries = getBoostQueries();
for (Query f : boostQueries) {
query.add(f, BooleanClause.Occur.SHOULD);
}
/* * * Boosting Functions * * */
List<Query> boostFunctions = getBoostFunctions();
for (Query f : boostFunctions) {
query.add(f, BooleanClause.Occur.SHOULD);
}
//
// create a boosted query (scores multiplied by boosts)
//
Query topQuery = query.build();
List<ValueSource> boosts = getMultiplicativeBoosts();
if (boosts.size() > 1) {
ValueSource prod = new ProductFloatFunction(boosts.toArray(new ValueSource[boosts.size()]));
topQuery = new BoostedQuery(topQuery, prod);
} else if (boosts.size() == 1) {
topQuery = new BoostedQuery(topQuery, boosts.get(0));
}
return topQuery;
}
Aggregations