如何将排序添加到弹簧数据弹性搜索

Posted

技术标签:

【中文标题】如何将排序添加到弹簧数据弹性搜索【英文标题】: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();
    

【问题讨论】:

【参考方案1】:

您可以为此使用SortBuilders

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

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

希望对你有帮助

【讨论】:

好的,如何添加到这个字段顺序? 根据您的要求编辑 如何按多个字段排序?

以上是关于如何将排序添加到弹簧数据弹性搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何将弹性搜索索引或日志从一个弹性搜索服务器复制到另一台?

获取将千分尺集成到弹性搜索应用程序的异常

如何将配置单元映射到弹性搜索 _id 字段

如何在弹性搜索中创建索引和类型?

Spring数据弹性搜索总和 - 价格,数量

如何使用弹性搜索索引 10 亿行 CSV 文件?