2017-07-12 25 views
1

userIdがnullの場合、.withQuery(QueryBuilders.matchQuery( "createdBy"、userId))を削除します。この条件では、渡すパラメータに従って動的に検索を実装する方法はありますか。NativeSearchQueryBuilder()で動的に検索を実装する方法は?

右、 matchQueryがNULL値を受け入れて、スローされません
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

:あなたは、いくつかの追加の準備の後にそれを構築することができるように

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(クエリ)、Province.class); はfalseを返します。 hasChildQueryを解決できません。どのクラスをインポートする必要がありますか? @Joanna –

+0

'QueryBuilders.hasChildQuery(type、query、scoreMode);' 'org.elasticsearch.index.query.QueryBuilders'からの使用 – Joanna

関連する問題