Elasticsearch Java API中的过滤查询

Sag*_*gar 24 elasticsearch

在Elasticsearch Java API中创建Filtered查询时我有点困惑.SearchRequestBuilder类有setPostFilter方法,这个方法的javadoc清楚地表明在执行Query之后将应用过滤器.

但是,没有setFilter方法或其他一些允许在
执行查询之前应用过滤器的方法.如何创建过滤查询(在执行查询之前基本上应用过滤器)?我错过了什么吗?

Bla*_*POP 30

 FilteredQueryBuilder builder = 
 QueryBuilders.filteredQuery(QueryBuilders.termQuery("test", 
 "test"),FilterBuilders.termFilter("test","test"));
Run Code Online (Sandbox Code Playgroud)

它将构建过滤后的查询...对于filteredQuery,第一个参数是查询,第二个参数是Filter.

更新:过滤查询在elasticsearch 2.0+中折旧.参考

希望能帮助到你..!


dap*_*hez 9

QueryBuilders.filteredQuery 在API v.2.0.0及更高版本中已弃用.

相反,过滤器和查询具有"平等权利".FilterBuilders不再存在,所有过滤器都是使用构建的QueryBuilders.

要仅使用过滤器(在本例中为地理过滤器)实现查询,您现在可以:

QueryBuilder query = QueryBuilders.geoDistanceQuery("location")
        .point(center.getLatitude(), center.getLongitude())
        .distance(radius, DistanceUnit.METERS);

// and then...
SearchResponse resp = client.prepareSearch(index).setQuery(query);
Run Code Online (Sandbox Code Playgroud)

如果你想用两个方面来查询,你将需要使用boolQuery具有must:

QueryBuilder query = QueryBuilders.boolQuery()
            .must(QueryBuilders.termQuery("user", "ben"))
            .must(QueryBuilders.termQuery("rank", "mega"));

// and then...
SearchResponse resp = client.prepareSearch(index).setQuery(query);
Run Code Online (Sandbox Code Playgroud)


Tho*_*Tho 8

如果您只想在没有查询的情况下执行过滤器,您可以这样做:

FilteredQueryBuilder builder = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
   FilterBuilders.termFilter("username","stackoverflow"));
Run Code Online (Sandbox Code Playgroud)

参考:无需查询即可过滤