使用 post_filter 和 Spring 数据 Elasticsearch 的 NativeSearchQueryBuilder

Using post_filter with Spring Data Elasticsearch's NativeSearchQueryBuilder

我参考的是NativeSearchQueryBuilderspring数据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 data elasticsearch 中找到任何方法。

调用ElasticsearchTemplate.queryForPage(SearchQuery query, Class<T> clazz)方法时隐式使用post_filter。它将检查 SearchQuery 参数是否包含 filter,如果包含,它将使用本机 SearchRequestBuilder.

上的过滤器调用 setPostFilter()

所以您可以像这样使用 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 will set the post_filtername 字段上使用上述 term 过滤器。