2017-07-12 408 views
1

如果userId为空,我想删除.withQuery(QueryBuilders.matchQuery(“createdBy”,userId))这个条件,我该如何根据我的传递参数动态地实现搜索。如何使用NativeSearchQueryBuilder()动态实现搜索?

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; 
} 

回答

0

右键,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(); 
+0

非常感谢。 –

+0

'QueryBuilder query = hasChildQuery(Province.CHILD_TYPE,QueryBuilders.termQuery(“name”,name.toLowerCase()),ScoreMode.None); 列表 parents = operations.queryForList(新的NativeSearchQuery(query),Province.class); 返回false;'。 hasChildQuery无法解析,应导入哪个类? @Joanna –

+0

使用'QueryBuilders.hasChildQuery(type,query,scoreMode);'from'org.elasticsearch.index.query.QueryBuilders' – Joanna