1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.query;
17
18 import org.apache.logging.log4j.LogManager;
19 import org.apache.logging.log4j.Logger;
20 import org.apache.lucene.index.Term;
21 import org.apache.lucene.search.FuzzyQuery;
22 import org.apache.lucene.search.Query;
23 import org.codelibs.fess.Constants;
24 import org.codelibs.fess.entity.QueryContext;
25 import org.codelibs.fess.exception.InvalidQueryException;
26 import org.codelibs.fess.mylasta.direction.FessConfig;
27 import org.codelibs.fess.util.ComponentUtil;
28 import org.lastaflute.core.message.UserMessages;
29 import org.opensearch.common.unit.Fuzziness;
30 import org.opensearch.index.query.QueryBuilder;
31 import org.opensearch.index.query.QueryBuilders;
32
33
34
35
36
37
38
39 public class FuzzyQueryCommand extends QueryCommand {
40 private static final Logger logger = LogManager.getLogger(FuzzyQueryCommand.class);
41
42
43
44
45 public FuzzyQueryCommand() {
46 super();
47 }
48
49 @Override
50 protected String getQueryClassName() {
51 return FuzzyQuery.class.getSimpleName();
52 }
53
54
55
56
57
58
59
60
61
62
63 @Override
64 public QueryBuilder execute(final QueryContext context, final Query query, final float boost) {
65 if (query instanceof final FuzzyQuery fuzzyQuery) {
66 if (logger.isDebugEnabled()) {
67 logger.debug("FuzzyQuery: query={}, boost={}", query, boost);
68 }
69 return convertFuzzyQuery(context, fuzzyQuery, boost);
70 }
71 throw new InvalidQueryException(messages -> messages.addErrorsInvalidQueryUnknown(UserMessages.GLOBAL_PROPERTY_KEY),
72 "Unknown q: " + query.getClass() + " => " + query);
73 }
74
75
76
77
78
79
80
81
82
83
84 protected QueryBuilder convertFuzzyQuery(final QueryContext context, final FuzzyQuery fuzzyQuery, final float boost) {
85 final FessConfig fessConfig = ComponentUtil.getFessConfig();
86 final Term term = fuzzyQuery.getTerm();
87 final String field = getSearchField(context.getDefaultField(), term.field());
88
89 if (Constants.DEFAULT_FIELD.equals(field)) {
90 final String text = term.text();
91 context.addFieldLog(field, text);
92 context.addHighlightedQuery(text);
93 return buildDefaultQueryBuilder(fessConfig, context,
94 (f, b) -> QueryBuilders.fuzzyQuery(f, text)
95 .fuzziness(Fuzziness.fromEdits(fuzzyQuery.getMaxEdits()))
96 .boost(b * boost)
97 .maxExpansions(fessConfig.getQueryFuzzyExpansionsAsInteger())
98 .prefixLength(fessConfig.getQueryFuzzyPrefixLengthAsInteger())
99 .transpositions(Constants.TRUE.equalsIgnoreCase(fessConfig.getQueryFuzzyTranspositions())));
100 }
101
102 if (isSearchField(field)) {
103 final String text = term.text();
104 context.addFieldLog(field, text);
105 context.addHighlightedQuery(text);
106 return QueryBuilders.fuzzyQuery(field, text)
107 .boost(boost)
108 .fuzziness(Fuzziness.fromEdits(fuzzyQuery.getMaxEdits()))
109 .maxExpansions(fessConfig.getQueryFuzzyExpansionsAsInteger())
110 .prefixLength(fessConfig.getQueryFuzzyPrefixLengthAsInteger())
111 .transpositions(Constants.TRUE.equalsIgnoreCase(fessConfig.getQueryFuzzyTranspositions()));
112 }
113
114 final String origQuery = term.toString();
115 context.addFieldLog(Constants.DEFAULT_FIELD, origQuery);
116 context.addHighlightedQuery(origQuery);
117 return buildDefaultQueryBuilder(fessConfig, context,
118 (f, b) -> QueryBuilders.fuzzyQuery(f, origQuery)
119 .fuzziness(Fuzziness.fromEdits(fuzzyQuery.getMaxEdits()))
120 .boost(b * boost)
121 .maxExpansions(fessConfig.getQueryFuzzyExpansionsAsInteger())
122 .prefixLength(fessConfig.getQueryFuzzyPrefixLengthAsInteger())
123 .transpositions(Constants.TRUE.equalsIgnoreCase(fessConfig.getQueryFuzzyTranspositions())));
124 }
125 }