ElasticSearch – FunctionScoreQuery

By | 2022년 12월 23일
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();
    }
}

답글 남기기