springboot整合elasticsearch8组合条件查询

整合过程见上一篇文章
springboot整合elasticsearch8

1.es8多条件组合查询
@Slf4j
@RestController
@RequestMapping("/elastic")
public class ElasticSearchTestController {

    @Autowired
    private ElasticsearchClient client;
    
     @GetMapping("/user")
    public List getUser() throws IOException {

        List<User> userList = new ArrayList<>();
        String name = "张三";

        // 构建查询条件
        List<Query> queryList = new ArrayList<>();
        
        // MatchPhraseQuery
        Query byName = MatchPhraseQuery.of(m -> m
                .field("name")
                .query(name)
        )._toQuery();

        // RangeQuery
        Query byAge1 = RangeQuery.of(r -> r
                .field("age")
                .gte(JsonData.of(10))
        )._toQuery();

        Query byAge2 = RangeQuery.of(r -> r
                .field("age")
                .lte(JsonData.of(13))
        )._toQuery();

        // TermsQuery
        List<FieldValue> ls = new ArrayList<>();
        ls.add(FieldValue.of("男"));
        ls.add(FieldValue.of("女"));
        Query termsQuery = TermsQuery.of(t ->t.field("sex").terms(terms ->terms.value(ls)))._toQuery();

        queryList.add(byName);
        queryList.add(byAge1);
        queryList.add(byAge2);
        queryList.add(termsQuery);

        String[] sources = new String[]{"name", "age"};

        SearchResponse<User> response = client.search(s -> s
                        .index("user").query(q -> q.bool(b -> b.must(queryList)))
                        .sort(sort -> sort.field(f -> f.field("age").order(SortOrder.Asc)))     //排序
                        .source(sc -> sc                                                        //查询字段过滤
                                .filter(f -> f
                                        .includes(Arrays.asList(sources))
                                )
                        )
                        .from(0)                                                                 //分页
                        .size(10),                                            
                User.class
        );

        List<Hit<User>> hits = response.hits().hits();
        for (Hit<User> hit: hits) {
            userList.add(hit.source());
        }
        return  userList;
    }
}
2.使用scroll进行大数据量查询
 		...
		// 第一次查询
		SearchResponse<User> response = client.search(s -> s
                        .index("user")
                        .query(q -> q.bool(b -> b.must(queryList)))                                                             
                        .size(5000)
                        .scroll(t ->t.time("5m")),                                               //开启scroll
                User.class
        );

        List<Hit<User>> hits = response.hits().hits();
        for (Hit<User> hit: hits) {
            userList.add(hit.source());
        }
        String scrollId = response.scrollId();
        List<String> strings = new ArrayList<>();
        strings.add(scrollId);
        ScrollResponse<User> search = null;

        do {
            String scrollIdTemp = scrollId;
            log.info(scrollIdTemp);
            search = client.scroll(s->s.scrollId(scrollIdTemp).scroll(t->t.time("5m")),User.class);
            for (Hit<User> hit : search.hits().hits()) {
                userList.add(hit.source());
            }
            scrollId = search.scrollId();
            strings.add(scrollId);
        }while(!search.hits().hits().isEmpty());
        // 清除scrollId
        client.clearScroll(c->c.scrollId(strings));
        ...      
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值