Table of Contents
ElasticSearch – FunctionScoreQuery
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
샘플
@Slf4j
@Component
@RequiredArgsConstructor
public class AutoCompleteRepository {
private final ElasticsearchClient client;
private FunctionScore buildFunctionScore(String field, String query, Double value) {
Query queryMatch = new Query
.Builder()
.match(new MatchQuery
.Builder()
.field(field)
.query(query)
.build()
).build();
return new FunctionScore.Builder()
.new ContainerBuilder()
.filter(queryMatch)
.weight(value)
.build();
}
private FunctionScore buildFunctionScore(String field, String query, Double value, Operator operator, String analyzer) {
Query queryMatch = new Query
.Builder()
.match(new MatchQuery
.Builder()
.field(field)
.operator(operator)
.analyzer(analyzer)
.query(query)
.build()
).build();
return new FunctionScore.Builder()
.new ContainerBuilder()
.filter(queryMatch)
.weight(value)
.build();
}
public List<Hit<AutoCompleteResultModel>> get(String queryString) throws IOException {
Query queryMatchAll = new Query.Builder().matchAll(new MatchAllQuery.Builder().build()).build();
ArrayList<FunctionScore> functionScores = new ArrayList<>();
functionScores.add(buildFunctionScore("search_string.raw", queryString, 1000.0));
functionScores.add(buildFunctionScore("search_string.jaso", queryString, 100.0, Operator.And, "suggest_search_analyzer"));
FunctionScoreQuery functionScoreQuery = new FunctionScoreQuery.Builder()
.query(queryMatchAll)
.functions(functionScores)
.boostMode(FunctionBoostMode.Multiply)
.scoreMode(FunctionScoreMode.Sum)
.minScore(2.0)
.build();
Query query = new Query.Builder().functionScore(functionScoreQuery).build();
List<SortOptions> sortOptions = new ArrayList<>();
sortOptions.add(SortOptions.of((b) -> {
FieldSort fieldSort = new FieldSort.Builder().field("_score").order(SortOrder.Desc).build();
return b.field(fieldSort);
}));
sortOptions.add(SortOptions.of((b) -> {
FieldSort fieldSort = new FieldSort.Builder().field("sort").order(SortOrder.Desc).build();
return b.field(fieldSort);
}));
SearchResponse<AutoCompleteResultModel> response = client.search(s -> s
.size(10)
.sort(sortOptions)
.index(IndexName.AUTO_COMPLETE)
.query(query),
AutoCompleteResultModel.class
);
return response.hits().hits();
}
}