java searchfilter_elasticsearch__5__java操作之FilterBuilders构建过滤器Query

本文详细介绍了Elasticsearch Java API中用于构建过滤器的各种方法,包括andFilter、boolFilter、existsFilter、idsFilter、limitFilter、typeFilter等。这些过滤器帮助开发者精确控制搜索结果,例如通过年龄范围、名称前缀、地理位置等条件进行过滤。同时,文章也提及了尚未解决的地理边界框和距离过滤器的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.elasticsearch;

import org.elasticsearch.action.ActionListener;

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.common.geo.GeoDistance;

import org.elasticsearch.common.unit.DistanceUnit;

import org.elasticsearch.index.query.*;

/**

* Created by lw on 14-7-16.

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* elasticsearch以提供了一个完整的Java查询dsl其余查询dsl。

* FilterBuilders工厂构建

* API:

* http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/query-dsl-filters.html

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

public class Es_FilterBuilders_DSL {

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* and Filter

* 一个过滤器匹配文档匹配的布尔组合其他过滤器。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder andFilter() {

return FilterBuilders.andFilter(

FilterBuilders.rangeFilter("age").from(1).to(1000),

FilterBuilders.prefixFilter("name", "葫芦1493")

);

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* bool Filter

* 一个过滤器匹配文档匹配的布尔组合其他过滤器。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder boolFilter() {

return FilterBuilders.boolFilter()

.must(FilterBuilders.termFilter("name", "葫芦1493娃"))

.mustNot(FilterBuilders.rangeFilter("age").from(1000).to(3000))

.should(FilterBuilders.termFilter("home", "山西省太原市7077街道"));

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* exists filter

* 一个过滤器来过滤字段唯一字段存在。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder existsFilter() {

return FilterBuilders.existsFilter("home");

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* ids filter

* 创建一个新的id筛选提供 doc/映射类型。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder idsFilter() {

return FilterBuilders.idsFilter(Es_Utils.INDEX_DEMO_01_MAPPING, "type2")

.addIds("SNt0KdNbRdKmXJVaXfNxEA", "UDKtO4o9TgmDHIT4bk_OWw", "jkAZoHe9RWyjxyOnBCTdrw");

// Type is optional

//FilterBuilders.idsFilter().addIds("1", "4", "100");

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* limit filter

* 一个过滤器,用于限制结果提供的极限值(每个shard * 2 )。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder limitFilter() {

return FilterBuilders.limitFilter(2);//返回碎片shard*2 个结果

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* type filter

* 过滤type

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder typeFilter() {

return FilterBuilders.typeFilter(Es_Utils.INDEX_DEMO_01_MAPPING);

}

/**

* TODO NotSolved

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* geo bounding box filter

* 定义一个过滤器来过滤基于边界框左上角和右下角的位置/分

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder geoBoundingBoxFilter() {

return FilterBuilders.geoBoundingBoxFilter("pin.location")

.topLeft(40.73, -74.1)

.bottomRight(40.717, -73.99);

}

/**

* TODO NotSolved

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* geodistance filter

* 一个过滤器来过滤基于一个特定的距离从一个特定的地理位置/点。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder geoDistanceFilter() {

return FilterBuilders.geoDistanceFilter("pin.location")

.point(40, -70)

.distance(200, DistanceUnit.KILOMETERS)

.optimizeBbox("memory") // Can be also "indexed" or "none"

.geoDistance(GeoDistance.ARC); // Or GeoDistance.PLANE

}

/**

* TODO NotSolved

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* geo distance range filter

* 一个过滤器来过滤基于一个特定的范围从一个特定的地理位置/点。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder geoDistanceRangeFilter() {

return FilterBuilders.geoDistanceRangeFilter("pin.location")

.point(40, -70)

.from("200km")

.to("400km")

.includeLower(true)

.includeUpper(false)

.optimizeBbox("memory") // Can be also "indexed" or "none"

.geoDistance(GeoDistance.ARC); // Or GeoDistance.PLANE

}

/**

* TODO NotSolved

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* geo polygon filter

* 一个过滤器来过滤基于多边形定义为一组位置/分。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder geoPolygonFilter() {

return FilterBuilders.geoPolygonFilter("pin.location")

.addPoint(40, -70)

.addPoint(30, -80)

.addPoint(20, -90);

}

/**

* TODO NotSolved

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* has child / has parent filters

* 构造一个子过滤器,子类型和查询与文档、过滤的结果是父* *文档。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder hasChildFilter() {

// Has Child

FilterBuilders.hasChildFilter("blog_tag",

QueryBuilders.termQuery("tag", "something"));

// Has Parent

return FilterBuilders.hasParentFilter("blog",

QueryBuilders.termQuery("tag", "something"));

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* match all filter

* 一个过滤器匹配所有文件。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder matchAllFilter() {

return FilterBuilders.matchAllFilter();

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* missing filter

* 一个过滤器来过滤字段唯一文件不存在。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder missingFilter() {

return FilterBuilders.missingFilter("name")

.existence(true)

.nullValue(true);

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* not filter

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder notFilter() {

return FilterBuilders.notFilter(

FilterBuilders.rangeFilter("age").from(1000).to(2000));

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* or filter

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder orFilter() {

return FilterBuilders.orFilter(

FilterBuilders.termFilter("name", "葫芦1493娃"),

FilterBuilders.termFilter("name", "葫芦5083娃")

);

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* prefix filter

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder prefixFilter() {

return FilterBuilders.prefixFilter("name", "葫芦5083");

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* query filter

* 一个过滤器,仅包装一个查询。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder queryFilter() {

return FilterBuilders.queryFilter(

QueryBuilders.queryString("name")

);

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* range filter

* 过滤器,限制搜索结果值在给定的范围内。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder rangeFilter() {

FilterBuilders.rangeFilter("age")

.from(1000)

.to(2000)

.includeLower(true)

.includeUpper(false);

// A simplified form using gte, gt, lt or lte

return FilterBuilders.rangeFilter("age")

.gte(1000)

.lt(2000);

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* script filter

* 过滤器基于脚本的构建。

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder scriptFilter() {

return FilterBuilders.scriptFilter(

"doc['age'].value > param1"

).addParam("param1", 1000);

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* term filter

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder termFilter() {

return FilterBuilders.termFilter("name", "葫芦5083娃");

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* terms filter

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* The execution option now has the following options :

*

* plain

* The default. Works as today. Iterates over all the terms, building a bit set matching it, and filtering. The total filter is cached.

*

* fielddata

* Generates a terms filters that uses the fielddata cache to compare terms.

* This execution mode is great to use when filtering on a field that is already loaded into the fielddata cache from faceting, sorting, or index warmers.

* When filtering on a large number of terms, this execution can be considerably faster than the other modes.

* The total filter is not cached unless explicitly configured to do so.

*

* bool

* Generates a term filter (which is cached) for each term, and wraps those in a bool filter.

* The bool filter itself is not cached as it can operate very quickly on the cached term filters.

*

* and

* Generates a term filter (which is cached) for each term, and wraps those in an and filter.

* The and filter itself is not cached.

*

* or

* Generates a term filter (which is cached) for each term, and wraps those in an or filter.

* The or filter itself is not cached. Generally, the bool execution mode should be preferred.

*/

protected static FilterBuilder termsFilter() {

return FilterBuilders.termsFilter("name", "葫芦5083娃", "葫芦3582娃")

.execution("plain"); // 执行模式 Cane be either "plain", "bool" "and". Defaults to "plain".

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* nested filter

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder nestedFilter() {

return FilterBuilders.nestedFilter("obj1",

QueryBuilders.boolQuery()

.must(QueryBuilders.matchQuery("obj1.name", "blue"))

.must(QueryBuilders.rangeQuery("obj1.count").gt(5))

);

}

/**

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* caching

* 缓存 过滤器

* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*/

protected static FilterBuilder cache() {

return FilterBuilders.andFilter(

FilterBuilders.rangeFilter("age").from(1000).to(9000),

FilterBuilders.prefixFilter("name", "葫芦3582")

)

.cache(true);//默认false

}

public static void main(String[] args) {

Es_Utils.startupClient();

try {

searchTest(cache());

} catch (Exception e) {

e.printStackTrace();

} finally {

Es_Utils.shutDownClient();

}

}

private static void searchTest(FilterBuilder filterBuilder) {

//预准备执行搜索

Es_Utils.client.prepareSearch(Es_Utils.INDEX_DEMO_01)

.setTypes(Es_Utils.INDEX_DEMO_01_MAPPING)

.setPostFilter(filterBuilder)

.setFrom(0).setSize(20).setExplain(true)

.execute()

//注册监听事件

.addListener(new ActionListener() {

@Override

public void onResponse(SearchResponse searchResponse) {

Es_Utils.writeSearchResponse(searchResponse);

}

@Override

public void onFailure(Throwable e) {

}

});

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值