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) {

                    }
                });
    }
}
时间: 2024-08-02 15:12:16

filterBuilders 构建过滤器query的相关文章

Elasticsearch的javaAPI之facet,count,delete by query

Elasticsearch的javaAPI之count count API允许轻松地执行一个查询,获得匹配的数量,可以跨越一个或多个index ,一个或多个type. import static org.elasticsearch.index.query.xcontent.FilterBuilders.*; import static org.elasticsearch.index.query.xcontent.QueryBuilders.*; CountResponse response =

elasticsearch 过滤器的种类

elasticsearch之查询过滤 elasticsearch elastic-search xixicat 2月13日发布 推荐 1 推荐 收藏 2 收藏,289 浏览 序 本文主要记录es的查询过滤的使用. 使用过滤器 过滤器不影响评分,而评分计算让搜索变得复杂,而且需要CPU资源,因而尽量使用过滤器,而且过滤器容易被缓存,进一步提升查询的整体性能. post_filter(先查询再过滤) { "query": { "match":{"title&q

核心J2EE模式 - 截取过滤器

核心J2EE模式 - 截取过滤器 背景 呈现层请求处理机制接收许多不同类型的请求,这些请求需要不同类型的处理.一些请求被简单转发到适当的处理程序组件,而其他请求必须在进一步处理之前进行修改,审核或未压缩. 存在的问题 需要预处理和后处理客户端Web请求和响应. 当请求进入Web应用程序时,它通常必须在主处理阶段之前通过几个入口测试.例如, 客户端是否经过身份验证? 客户端是否有有效的会话? 客户端的IP地址是否受信任的网络? 请求路径是否违反任何约束? 客户端使用什么编码来发送数据? 我们是否支

luncene 各种Query类详解实例

搜索流程中的第二步就是构建一个Query.下面就来介绍Query及其构建. 当用户输入一个关键字,搜索引擎接收到后,并不是立刻就将它放入后台开始进行关键字的检索,而应当首先对这个关键字进行一定的分析和处理,使之成为一种后台可以理解的形式,只有这样,才能提高检索的效率,同时检索出更加有效的结果.那么,在Lucene中,这种处理,其实就是构建一个Query对象. 就Query对象本身言,它只是Lucene的search包中的一个抽象类,这个抽象类有许多子类,代表了不同类型的检索.如常见的TermQu

ArcGIS api for javascript——查询,然后单击显示信息窗口

描述 本例展示如何配置查询任务为示例的工作流程: 1.用户单击一个要素来加亮显示. 2.用户再一次单击要素来查看属性信息的 InfoWindow. 本例查询USA州,因此ESRI_StateCityHighway_USA的州图层被传给QueryTask构造函数. 第一次鼠标单击通过下面的事件监听器捕获: dojo.connect(map, "onClick", executeQueryTask); 发生单击时,executeQueryTask函数被调用去执行查询,然后showResul

管道过滤器模式(Pipe and Filter)与组合模式(修改)

转自:http://haolloyin.blog.51cto.com/1177454/348277 之前在 benjielin 前辈的博客中看到“管道过滤器(Pipe-And-Filter)模式(http://bj007.blog.51cto.com/1701577/345677)”,当时将文章中运用到的组合模式(Composite)与我刚刚写过的装饰模式(Decorator)和职责链模式(Chain of Responsibility)混为一谈,并希望用这后面两个模式进行代码实现,+_+ 现在

(三)Mina源码解析之IoFilter

本篇文章主要剖析Mina中的过滤器是如何实现的 首先还是引入一个简单的完整的server端的例子,代码如下 public class Server { public static void main(String[] args) { IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setId

使用 Apache MINA2 实现 Web 系统的消息中间件

本文将介绍如何使用 Apache MINA2(以下简称 MINA2)解决复杂 Web 系统内各子系统之间同步消息中间件的问题.MINA2 为开发高性能和高可用性的网络应用程序提供了非常便利的框架.从本文中可以了解 MINA2 的基本原理和主要功能,此外在本文中您还可以看到 MINA2 实现消息中间件的服务端和客户端程序的详细内容. 4 评论: 苏 梦, 软件工程师, IBM 尹 文清, Java 开发工程师, 百度在线 2011 年 8 月 25 日 内容 项目背景介绍 系统发展遇到的瓶颈问题

老叶观点:MySQL开发规范之我见

大多数MySQL规范在网上也都能找得到相关的分享,在这里要分享的是老叶个人认为比较重要的,或者容易被忽视的,以及容易被混淆的一些地方. 1.默认使用InnoDB引擎[老叶观点]已多次呼吁过了,InnoDB适用于几乎99%的MySQL应用场景,而且在MySQL 5.7的系统表都改成InnoDB了,还有什么理由再死守MyISAM呢. 此外,频繁读写的InnoDB表,一定要使用具有自增/顺序特征的整型作为显式主键. [参考]:[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键.