【问题标题】:Using post_filter with Spring Data Elasticsearch's NativeSearchQueryBuilder将 post_filter 与 Spring Data Elasticsearch 的 NativeSearchQueryBuilder 一起使用
【发布时间】:2015-08-10 09:05:32
【问题描述】:

我指的是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 中没有找到任何方法。

【问题讨论】:

    标签: elasticsearch spring-data-elasticsearch


    【解决方案1】:

    当您调用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 过滤器。

    【讨论】:

    • 绝对是答案。
    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 2019-11-09
    • 2016-09-24
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2017-05-20
    相关资源
    最近更新 更多