我参考了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数据弹性搜索中做到这一点。
答案 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
。