Skip to content

Commit

Permalink
fix #2648 query improvement
Browse files Browse the repository at this point in the history
  • Loading branch information
marevol committed May 3, 2022
1 parent 17d9ae7 commit 0579b94
Show file tree
Hide file tree
Showing 7 changed files with 435 additions and 56 deletions.
14 changes: 7 additions & 7 deletions src/main/java/org/codelibs/fess/entity/QueryContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,19 @@ public class QueryContext {

protected static final String ALLINTITLE_FIELD_PREFIX = "allintitle:";

private QueryBuilder queryBuilder;
protected QueryBuilder queryBuilder;

private final List<SortBuilder<?>> sortBuilderList = new ArrayList<>();
protected final List<SortBuilder<?>> sortBuilderList = new ArrayList<>();

private String queryString;
protected String queryString;

private Set<String> highlightedQuerySet = null;
protected Set<String> highlightedQuerySet = null;

private Map<String, List<String>> fieldLogMap = null;
protected Map<String, List<String>> fieldLogMap = null;

private boolean disableRoleQuery = false;
protected boolean disableRoleQuery = false;

private String defaultField = null;
protected String defaultField = null;

@SuppressWarnings("unchecked")
public QueryContext(final String queryString, final boolean isQuery) {
Expand Down
20 changes: 13 additions & 7 deletions src/main/java/org/codelibs/fess/query/FuzzyQueryCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,23 +54,29 @@ protected QueryBuilder convertFuzzyQuery(final QueryContext context, final Fuzzy
final FessConfig fessConfig = ComponentUtil.getFessConfig();
final Term term = fuzzyQuery.getTerm();
final String field = getSearchField(context.getDefaultField(), term.field());
// TODO fuzzy value

if (Constants.DEFAULT_FIELD.equals(field)) {
context.addFieldLog(field, term.text());
final String text = term.text();
context.addFieldLog(field, text);
context.addHighlightedQuery(text);
return buildDefaultQueryBuilder(fessConfig, context,
(f, b) -> QueryBuilders.fuzzyQuery(f, term.text()).fuzziness(Fuzziness.fromEdits(fuzzyQuery.getMaxEdits()))
.boost(b * boost).maxExpansions(fessConfig.getQueryFuzzyExpansionsAsInteger())
(f, b) -> QueryBuilders.fuzzyQuery(f, text).fuzziness(Fuzziness.fromEdits(fuzzyQuery.getMaxEdits())).boost(b * boost)
.maxExpansions(fessConfig.getQueryFuzzyExpansionsAsInteger())
.prefixLength(fessConfig.getQueryFuzzyPrefixLengthAsInteger())
.transpositions(Constants.TRUE.equalsIgnoreCase(fessConfig.getQueryFuzzyTranspositions())));
}

if (isSearchField(field)) {
context.addFieldLog(field, term.text());
return QueryBuilders.fuzzyQuery(field, term.text()).boost(boost).fuzziness(Fuzziness.fromEdits(fuzzyQuery.getMaxEdits()))
final String text = term.text();
context.addFieldLog(field, text);
context.addHighlightedQuery(text);
return QueryBuilders.fuzzyQuery(field, text).boost(boost).fuzziness(Fuzziness.fromEdits(fuzzyQuery.getMaxEdits()))
.maxExpansions(fessConfig.getQueryFuzzyExpansionsAsInteger())
.prefixLength(fessConfig.getQueryFuzzyPrefixLengthAsInteger())
.transpositions(Constants.TRUE.equalsIgnoreCase(fessConfig.getQueryFuzzyTranspositions()));
}
final String origQuery = fuzzyQuery.toString();

final String origQuery = term.toString();
context.addFieldLog(Constants.DEFAULT_FIELD, origQuery);
context.addHighlightedQuery(origQuery);
return buildDefaultQueryBuilder(fessConfig, context,
Expand Down
17 changes: 15 additions & 2 deletions src/main/java/org/codelibs/fess/query/PhraseQueryCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.apache.lucene.index.Term;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;
import org.codelibs.fess.Constants;
import org.codelibs.fess.entity.QueryContext;
import org.codelibs.fess.exception.InvalidQueryException;
import org.codelibs.fess.mylasta.direction.FessConfig;
Expand Down Expand Up @@ -59,8 +60,20 @@ protected QueryBuilder convertPhraseQuery(final QueryContext context, final Phra
final String field = terms[0].field();
final String[] texts = stream(terms).get(stream -> stream.map(Term::text).toArray(n -> new String[n]));
final String text = String.join(" ", texts);
context.addFieldLog(field, text);
stream(texts).of(stream -> stream.forEach(t -> context.addHighlightedQuery(t)));

if (Constants.DEFAULT_FIELD.equals(field)) {
context.addFieldLog(field, text);
stream(texts).of(stream -> stream.forEach(t -> context.addHighlightedQuery(t)));
return buildDefaultQueryBuilder(fessConfig, context, (f, b) -> buildMatchPhraseQuery(f, text).boost(b * boost));
}

if (isSearchField(field)) {
context.addFieldLog(field, text);
stream(texts).of(stream -> stream.forEach(t -> context.addHighlightedQuery(t)));
return buildMatchPhraseQuery(field, text);
}

context.addFieldLog(Constants.DEFAULT_FIELD, text);
return buildDefaultQueryBuilder(fessConfig, context, (f, b) -> buildMatchPhraseQuery(f, text).boost(b * boost));
}

Expand Down
16 changes: 11 additions & 5 deletions src/main/java/org/codelibs/fess/query/PrefixQueryCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,16 @@ public QueryBuilder execute(final QueryContext context, final Query query, final
protected QueryBuilder convertPrefixQuery(final QueryContext context, final PrefixQuery prefixQuery, final float boost) {
final FessConfig fessConfig = ComponentUtil.getFessConfig();
final String field = getSearchField(context.getDefaultField(), prefixQuery.getField());
final String text = prefixQuery.getPrefix().text();

if (Constants.DEFAULT_FIELD.equals(field)) {
context.addFieldLog(field, prefixQuery.getPrefix().text());
context.addFieldLog(field, text + "*");
context.addHighlightedQuery(text);
return buildDefaultQueryBuilder(fessConfig, context,
(f, b) -> QueryBuilders.matchPhrasePrefixQuery(f, toLowercaseWildcard(prefixQuery.getPrefix().text())).boost(b * boost)
(f, b) -> QueryBuilders.matchPhrasePrefixQuery(f, toLowercaseWildcard(text)).boost(b * boost)
.maxExpansions(fessConfig.getQueryPrefixExpansionsAsInteger()).slop(fessConfig.getQueryPrefixSlopAsInteger()));
}

if (!isSearchField(field)) {
final String query = prefixQuery.getPrefix().toString();
final String origQuery = toLowercaseWildcard(query);
Expand All @@ -70,11 +74,13 @@ protected QueryBuilder convertPrefixQuery(final QueryContext context, final Pref
(f, b) -> QueryBuilders.matchPhrasePrefixQuery(f, origQuery).boost(b * boost)
.maxExpansions(fessConfig.getQueryPrefixExpansionsAsInteger()).slop(fessConfig.getQueryPrefixSlopAsInteger()));
}
context.addFieldLog(field, prefixQuery.getPrefix().text() + "*");

context.addFieldLog(field, text + "*");
context.addHighlightedQuery(text);
if (getQueryFieldConfig().notAnalyzedFieldSet.contains(field)) {
return QueryBuilders.prefixQuery(field, toLowercaseWildcard(prefixQuery.getPrefix().text())).boost(boost);
return QueryBuilders.prefixQuery(field, toLowercaseWildcard(text)).boost(boost);
}
return QueryBuilders.matchPhrasePrefixQuery(field, toLowercaseWildcard(prefixQuery.getPrefix().text())).boost(boost)
return QueryBuilders.matchPhrasePrefixQuery(field, toLowercaseWildcard(text)).boost(boost)
.maxExpansions(fessConfig.getQueryPrefixExpansionsAsInteger()).slop(fessConfig.getQueryPrefixSlopAsInteger());
}

Expand Down
13 changes: 12 additions & 1 deletion src/main/java/org/codelibs/fess/query/TermRangeQueryCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.util.BytesRef;
Expand Down Expand Up @@ -53,12 +54,22 @@ public QueryBuilder execute(final QueryContext context, final Query query, final
protected QueryBuilder convertTermRangeQuery(final QueryContext context, final TermRangeQuery termRangeQuery, final float boost) {
final FessConfig fessConfig = ComponentUtil.getFessConfig();
final String field = getSearchField(context.getDefaultField(), termRangeQuery.getField());

if (!isSearchField(field)) {
final String origQuery = termRangeQuery.toString();
final StringBuilder queryBuf = new StringBuilder();
queryBuf.append(termRangeQuery.includesLower() ? '[' : '{');
final BytesRef lowerTerm = termRangeQuery.getLowerTerm();
queryBuf.append(lowerTerm != null ? ("*".equals(Term.toString(lowerTerm)) ? "\\*" : Term.toString(lowerTerm)) : "*");
queryBuf.append(" TO ");
final BytesRef upperTerm = termRangeQuery.getUpperTerm();
queryBuf.append(upperTerm != null ? ("*".equals(Term.toString(upperTerm)) ? "\\*" : Term.toString(upperTerm)) : "*");
queryBuf.append(termRangeQuery.includesUpper() ? ']' : '}');
final String origQuery = queryBuf.toString();
context.addFieldLog(Constants.DEFAULT_FIELD, origQuery);
context.addHighlightedQuery(origQuery);
return buildDefaultQueryBuilder(fessConfig, context, (f, b) -> QueryBuilders.matchPhraseQuery(f, origQuery).boost(b));
}

context.addFieldLog(field, termRangeQuery.toString(field));
final RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery(field);
final BytesRef min = termRangeQuery.getLowerTerm();
Expand Down
27 changes: 21 additions & 6 deletions src/main/java/org/codelibs/fess/query/WildcardQueryCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import java.util.Locale;

import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.lucene.search.Query;
Expand Down Expand Up @@ -56,18 +57,32 @@ protected QueryBuilder convertWildcardQuery(final QueryContext context, final Wi
final FessConfig fessConfig = ComponentUtil.getFessConfig();
final String field = getSearchField(context.getDefaultField(), wildcardQuery.getField());
if (Constants.DEFAULT_FIELD.equals(field)) {
context.addFieldLog(field, wildcardQuery.getTerm().text());
final String text = wildcardQuery.getTerm().text();
context.addFieldLog(field, text);
context.addHighlightedQuery(StringUtils.strip(text, "*"));
return buildDefaultQueryBuilder(fessConfig, context,
(f, b) -> QueryBuilders.wildcardQuery(f, toLowercaseWildcard(wildcardQuery.getTerm().text())).boost(b * boost));
(f, b) -> QueryBuilders.wildcardQuery(f, toLowercaseWildcard(text)).boost(b * boost));
}

if (isSearchField(field)) {
context.addFieldLog(field, wildcardQuery.getTerm().text());
return QueryBuilders.wildcardQuery(field, toLowercaseWildcard(wildcardQuery.getTerm().text())).boost(boost);
final String text = wildcardQuery.getTerm().text();
context.addFieldLog(field, text);
context.addHighlightedQuery(StringUtils.strip(text, "*"));
return QueryBuilders.wildcardQuery(field, toLowercaseWildcard(text)).boost(boost);
}

final String query = wildcardQuery.getTerm().toString();
final String origQuery = "*" + toLowercaseWildcard(query) + "*";
final StringBuilder queryBuf = new StringBuilder(query.length() + 2);
if (!query.startsWith("*")) {
queryBuf.append('*');
}
queryBuf.append(toLowercaseWildcard(query));
if (!query.endsWith("*")) {
queryBuf.append('*');
}
final String origQuery = queryBuf.toString();
context.addFieldLog(Constants.DEFAULT_FIELD, origQuery);
context.addHighlightedQuery(query);
context.addHighlightedQuery(StringUtils.strip(query, "*"));
return buildDefaultQueryBuilder(fessConfig, context, (f, b) -> QueryBuilders.wildcardQuery(f, origQuery).boost(b * boost));
}

Expand Down
Loading

0 comments on commit 0579b94

Please sign in to comment.