【问题标题】:How to implement search dynamically with NativeSearchQueryBuilder()?如何使用 NativeSearchQueryBuilder() 动态实现搜索?
【发布时间】:2017-07-12 09:43:42
【问题描述】:

如果 userId 为 null ,我想去掉 .withQuery(QueryBuilders.matchQuery("createdBy",userId)) 这个条件,如何根据我传递的参数动态实现搜索。

 public <T> List<T> search(String index, String type, String tenantId ,String userId, String queryString, Class<T> clzz){
    log.debug("==========search==========");
    String allField = "_all";
    MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(queryString, allField);

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withIndices(index)
            .withTypes(type)
            .withQuery(multiMatchQueryBuilder)
            .withQuery(QueryBuilders.matchQuery("tenantId",tenantId))
            .withQuery(QueryBuilders.matchQuery("createdBy",userId))
            .build();
    List<T> list =
            operations.queryForPage(searchQuery,clzz).getContent();
    return list;
}

【问题讨论】:

    标签: search spring-data-elasticsearch


    【解决方案1】:

    对,matchQuery不接受空值并抛出:

    java.lang.IllegalArgumentException: [match] requires query value
    

    NativeSearchQueryBuilder 与任何其他对象一样,因此您可以在进行一些额外准备后构建它。可能不是最漂亮的,但会做你想做的:

    NativeSearchQueryBuilder nativeSearch = new NativeSearchQueryBuilder()
        .withIndices(index)
        .withTypes(type)
        .withQuery(multiMatchQueryBuilder)
        .withQuery(QueryBuilders.matchQuery("tenantId", tenantId));
    
    if (userId != null) {
        nativeSearch.withQuery(QueryBuilders.matchQuery("createdBy", userId));
    }
    
    SearchQuery searchQuery = nativeSearch.build();
    

    【讨论】:

    • 非常感谢。
    • QueryBuilder query = hasChildQuery(Province.CHILD_TYPE, QueryBuilders.termQuery("name", name.toLowerCase()), ScoreMode.None); List&lt;Province&gt; parents = operations.queryForList(new NativeSearchQuery(query), Province.class); return false; 。 hasChildQuery 无法解析,我应该导入什么类? @乔安娜
    • 使用来自org.elasticsearch.index.query.QueryBuildersQueryBuilders.hasChildQuery(type, query, scoreMode);
    • 有OR查询的可能吗? nativeSearch.withQuery(QueryBuilders.matchQuery("createdBy", userId)); nativeSearch.withQuery(QueryBuilders.matchQuery("assignedTo", userId));
    • 如果用户匹配任何一个createdBy或assignedTo,我想要ES的结果。
    猜你喜欢
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2011-10-19
    • 2011-04-08
    • 2021-10-29
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多