将post_filter与Spring Data Elasticsearch的NativeSearchQueryBuilder一起使用

时间:2015-08-10 09:05:33

标签: elasticsearch spring-data-elasticsearch

我参考了NativeSearchQueryBuilder spring data elasticsearch。

post_filter设置为nativeSearchQuery的方法是什么?

似乎可以使用原生elasticsearch搜索API:见here,如下所示:

SearchResponse response = client.prepareSearch("index1", "index2")
        .setTypes("type1", "type2")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(QueryBuilders.termQuery("multi", "test"))             // Query
        .setPostFilter(FilterBuilders.rangeFilter("age").from(12).to(18))   // Filter
        .setFrom(0).setSize(60).setExplain(true)
        .execute()
        .actionGet();

但是我还没有找到任何方法在Spring数据弹性搜索中做到这一点。

1 个答案:

答案 0 :(得分:3)

调用ElasticsearchTemplate.queryForPage(SearchQuery query, Class<T> clazz)方法时隐式使用post_filter。它会检查SearchQuery参数是否包含filter,如果包含setPostFilter()参数,则会使用原始SearchRequestBuilder上的过滤器调用NativeSearchQueryBuilder

因此,您可以使用private ElasticsearchTemplate elasticsearchTemplate; SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(matchAllQuery()) <--- your query .withFilter(termFilter("name", "somename")) <--- your post filter .build(); Page<SampleEntity> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); 构建查询,如下所示:

ElasticsearchTemplate

通过term字段上的name过滤器,{{1}} will set the post_filter