使用 post_filter 和 Spring 数据 Elasticsearch 的 NativeSearchQueryBuilder
Using post_filter with Spring Data Elasticsearch's NativeSearchQueryBuilder
我参考的是NativeSearchQueryBuilder
spring数据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_filter
在 name
字段上使用上述 term
过滤器。
我参考的是NativeSearchQueryBuilder
spring数据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_filter
在 name
字段上使用上述 term
过滤器。