【问题标题】:How add sorting to spring data elasticsearch如何将排序添加到弹簧数据弹性搜索
【发布时间】:2016-05-20 12:09:53
【问题描述】:

我正在使用弹性搜索弹簧数据编写一个 api,我想添加排序。我在谷歌中找不到解决方案。所以我在这里写信问你们我怎么能做到这一点。如果您需要更多代码,请告诉我您需要什么,我会尝试添加更多代码。

我的代码如下:

AuctionQueryController.java

@RequestMapping(value = "/auctions/search", produces = MediaType.APPLICATION_JSON_VALUE)
    private List<Auction> search(
            @RequestParam(value = "categoryId", required = false) Long categoryId,
            @RequestParam(value = "treeCategoryId", required = false) Long treeCategoryId,
            @RequestParam(value = "currency", required = false) String currency,
            @RequestParam(value = "priceFrom", required = false) Long priceFrom,
            @RequestParam(value = "priceTo", required = false) Long priceTo,
            @RequestParam(value = "startDateFrom", required = false) Long startDateFrom,
            @RequestParam(value = "startDateTo", required = false) Long startDateTo,
            @RequestParam(value = "endDateFrom", required = false) Long endDateFrom,
            @RequestParam(value = "endDateTo", required = false) Long endDateTo,
            @RequestParam(value = "title", required = false) String title,
            @RequestParam(value = "uid", required = false) Long uid,
            Pageable pageable) {

        final AuctionIndexSearchParams searchParams = AuctionIndexSearchParams.builder()
                .categoryId(categoryId)
                .treeCategoryId(treeCategoryId)
                .currency(currency)
                .priceFrom(priceFrom)
                .priceTo(priceTo)
                .startDateFrom(startDateFrom)
                .startDateTo(startDateTo)
                .endDateFrom(endDateFrom)
                .endDateTo(endDateTo)
                .title(title)
                .uid(uid)
                .build();

        return auctionService.searchByIndexParams(searchParams, pageable);
    }

AuctionService.java

public List<Auction> searchByIndexParams(AuctionIndexSearchParams searchParams, Pageable pageable) {
        final List<FilterBuilder> filters = Lists.newArrayList();
        final NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery());

        Optional.ofNullable(searchParams.getCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("cat", v))));
        Optional.ofNullable(searchParams.getCurrency()).ifPresent(v -> filters.add(boolFilter().must(termFilter("curr", v))));
        Optional.ofNullable(searchParams.getTreeCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("tcat", v))));
        Optional.ofNullable(searchParams.getUid()).ifPresent(v -> filters.add(boolFilter().must(termFilter("uid", v))));

       final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

        if (Optional.ofNullable(searchParams.getTitle()).isPresent()) {
            boolQueryBuilder.should(queryStringQuery(searchParams.getTitle()).analyzeWildcard(true).field("title"));
        }

        if (Optional.ofNullable(searchParams.getStartDateFrom()).isPresent()
                && Optional.ofNullable(searchParams.getStartDateTo()).isPresent()) {
            filters.add(rangeFilter("start_date").from(searchParams.getStartDateFrom()).to(searchParams.getStartDateTo()));
        }

        if (Optional.ofNullable(searchParams.getEndDateFrom()).isPresent()
                && Optional.ofNullable(searchParams.getEndDateTo()).isPresent()) {
            filters.add(rangeFilter("end_date").from(searchParams.getEndDateFrom()).to(searchParams.getEndDateTo()));
        }

        if (Optional.ofNullable(searchParams.getPriceFrom()).isPresent()
                && Optional.ofNullable(searchParams.getPriceTo()).isPresent()) {
            filters.add(rangeFilter("price").from(searchParams.getPriceFrom()).to(searchParams.getPriceTo()));
        }

        searchQuery.withPageable(pageable);
        searchQuery.withQuery(boolQueryBuilder);
        FilterBuilder[] filterArr = new FilterBuilder[filters.size()];
        filterArr = filters.toArray(filterArr);
        searchQuery.withFilter(andFilter(filterArr));

        final FacetedPage<AuctionIndex> search = auctionIndexRepository.search(searchQuery.build());

        return search.map(index ->
                        auctionRepository.findAuctionById(Long.valueOf(index.getId()))
        ).getContent();
    }

【问题讨论】:

    标签: java elasticsearch spring-boot spring-data spring-data-elasticsearch


    【解决方案1】:

    您可以为此使用SortBuilders

            searchQuery.withSort(SortBuilders.fieldSort("fieldName").order(SortOrder.DESC))
    

    这将根据通过的fieldName 对结果进行排序。

    希望对你有帮助

    【讨论】:

    • 好的,如何添加到这个字段顺序?
    • 根据您的要求编辑
    • 如何按多个字段排序?
    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2019-01-26
    • 1970-01-01
    • 2020-02-07
    • 2014-08-16
    相关资源
    最近更新 更多