【问题标题】:Elasticsearch REST High Level Client combine query buildersElasticsearch REST 高级客户端结合查询构建器
【发布时间】:2018-06-05 13:38:11
【问题描述】:

我需要使用 ES REST 高级客户端 (Java) 创建类似于高级搜索的内容。
首先,我有一个搜索关键字,可以搜索所有字段。
我为此使用QueryStringQueryBuilder

SearchSourceBuilder ticketInfoSourceBuilder = new SearchSourceBuilder();
ticketInfoSourceBuilder.from(pageable.getOffset());
ticketInfoSourceBuilder.size(pageable.getPageSize());
ticketInfoSourceBuilder.sort(new FieldSortBuilder(sortField).order(sortOrder));
ticketInfoSourceBuilder.query(QueryBuilders.queryStringQuery("ABC1234"));

现在,我需要使用TermsQueryBuilder 添加更多过滤器。

是否可以将两个查询构建器结合起来?

我想添加以下过滤器:

"terms" : { "ticket.inquiryType" : ["INQTYP01", "INQTYP06"]}
"terms" : { "ticket.status" : ["NEW", "CLOSED"]}
"terms" : { "ticket.ownership" : ["OWNED", "OTHER_OWNER"]}

是否可以结合这两个查询构建器来实现类似高级搜索的功能?

谢谢!

【问题讨论】:

    标签: java spring-boot elasticsearch


    【解决方案1】:

    是的,您可以使用这样的 bool 查询来做到这一点:

    QueryBuilder query = QueryBuilders.boolQuery()
       .must(QueryBuilders.queryStringQuery("ABC1234"))
       .filter(QueryBuilders.termsQuery("ticket.inquiryType", "INQTYP01", "INQTYP06"))
       .filter(QueryBuilders.termsQuery("ticket.status", "NEW", "CLOSED"))
       .filter(QueryBuilders.termsQuery("ticket.ownership", "OWNED", "OTHER_OWNER"));
    ticketInfoSourceBuilder.query(query);
    

    【讨论】:

    • 很高兴它有帮助!
    • 好一个!对于术语查询,您可以传递一个 Set 而不是提及所有字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多