zoukankan      html  css  js  c++  java
  • filterBuilders 构建过滤器query

    FilterBuilders构建过滤器Query

    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:
     * <a>http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/query-dsl-filters.html</a>
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */
    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 :
         * <p/>
         * plain
         * The default. Works as today. Iterates over all the terms, building a bit set matching it, and filtering. The total filter is cached.
         * <p/>
         * 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.
         * <p/>
         * 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.
         * <p/>
         * 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.
         * <p/>
         * 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<SearchResponse>() {
                        @Override
                        public void onResponse(SearchResponse searchResponse) {
                            Es_Utils.writeSearchResponse(searchResponse);
                        }
    
                        @Override
                        public void onFailure(Throwable e) {
    
                        }
                    });
        }
    }
  • 相关阅读:
    一次心惊肉跳的服务器误删文件的恢复过程
    ThreadPoolExecutor使用详解
    Springboot学习笔记(一)-线程池的简化及使用
    springboot之异步调用@Async
    CentOS 7添加开机启动服务/脚本
    三分钟在任何电脑上使用 chrome os
    Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Nacos
    Nacos部署中的一些常见问题汇总
    Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Apollo
    Spring Cloud Alibaba 新版本发布:众多期待内容整合打包加入!
  • 原文地址:https://www.cnblogs.com/bmaker/p/5463974.html
Copyright © 2011-2022 走看看