zoukankan      html  css  js  c++  java
  • es工具类

    import org.elasticsearch.action.search.SearchRequest;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.index.query.BoolQueryBuilder;
    import org.elasticsearch.index.query.QueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.sort.SortOrder;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.IOException;
    import java.util.Collection;
    
    /**
     * es查询辅助类
     * @Author lix
     * @Date 2021/1/14
     */
    public class ESQueryHelper extends SearchRequest {
    
        private final Logger logger = LoggerFactory.getLogger(getClass());
    
        private BoolQueryBuilder bool;
        private QueryBuilder condition;
    
    
        private ESQueryHelper(String... indices) {
            super(indices);
            this.bool = new BoolQueryBuilder();
        }
    
        /**
         * 初始化方法
         *
         * @return
         */
        public static ESQueryHelper build(String... indic) {
            return new ESQueryHelper(indic);
        }
    
        /**
         * 返回 Request
         *
         * @return
         */
        public SearchRequest getRequest() {
            return this;
        }
    
        /**
         * 拼接and条件
         *
         * @param queryBuilder 条件
         * @return
         */
        public ESQueryHelper and(QueryBuilder queryBuilder) {
            bool.must(queryBuilder);
            return this;
        }
    
        /**
         * 拼接or条件
         *
         * @param queryBuilder
         * @return
         */
        public ESQueryHelper or(QueryBuilder queryBuilder) {
            bool.should(queryBuilder);
            return this;
        }
    
        /**
         * 拼接过滤条件。根据查询条件去查询文档,不去计算分数,而且filter会对经常被过滤的数据进行缓存
         *
         * @param queryBuilder
         * @return
         */
        public ESQueryHelper filter(QueryBuilder queryBuilder) {
            bool.filter(queryBuilder);
            return this;
        }
    
        /**
         * 拼接不等于条件
         *
         * @param queryBuilder
         * @return
         */
        public ESQueryHelper not(QueryBuilder queryBuilder) {
            bool.mustNot(queryBuilder);
            return this;
        }
    
        /**
         * 类似于sql:column like ‘%val%’
         *
         * @param column
         * @param val
         * @return
         */
        public static QueryBuilder like(String column, String val) {
            return QueryBuilders.wildcardQuery(column, "*".concat(val).concat("*"));
        }
    
        /**
         * 类似于sql:column like ‘%val’
         *
         * @param column
         * @param val
         * @return
         */
        public static QueryBuilder leftLike(String column, String val) {
            return QueryBuilders.wildcardQuery(column, "*".concat(val));
        }
    
        /**
         * 类似于sql:column like ‘val%’
         *
         * @param column
         * @param val
         * @return
         */
        public static QueryBuilder rightLike(String column, String val) {
            return QueryBuilders.wildcardQuery(column, val.concat("*"));
        }
    
        /**
         * 大于
         *
         * @param column
         * @param val
         * @return
         */
        public static QueryBuilder gt(String column, Object val) {
            return QueryBuilders.rangeQuery(column).gt(val);
        }
    
        /**
         * 小于
         *
         * @param column
         * @param val
         * @return
         */
        public static QueryBuilder lt(String column, Object val) {
            return QueryBuilders.rangeQuery(column).lt(val);
        }
    
        /**
         * 在 from 到 to之间,即 from < 查新内容 < to
         *
         * @param column 查询字段,如:age
         * @param from   如:5
         * @param to     如:20
         * @return
         */
        public static QueryBuilder between(String column, Object from, Object to) {
            return QueryBuilders.rangeQuery(column).gt(from).lte(to);
        }
    
        /**
         * 等于
         *
         * @param column
         * @param val
         * @return
         */
        public static QueryBuilder equals(String column, Object val) {
            return QueryBuilders.termQuery(column, val);
        }
    
        /**
         * 相当于mysql的in,即 column in(val1, val2....)
         *
         * @param column
         * @param val
         * @return
         */
        public static QueryBuilder in(String column, Object... val) {
            return QueryBuilders.termsQuery(column, val);
        }
    
        /**
         * 相当于mysql的in,即 column in(val1, val2....)
         *
         * @param column
         * @param inList
         * @return
         */
        public static QueryBuilder in(String column, Collection<Object> inList) {
            return QueryBuilders.termsQuery(column, inList);
        }
    
        /**
         * match 查询属于高级查询,会根据你查询字段的类型不一样,采用不同的查询方式.
         * 查询的是日期或者数值,他会将你基于字符串的查询内容转换为日期或数值对待.
         * 如果查询的内容是一个不能被分词的内容(keyword),match 不会将你指定的关键字进行分词.
         * 如果查询的内容是一个可以被分词的内容(text),match 查询会将你指定的内容根据一定的方式进行分词,去分词库中匹配指定的内容.
         * match 查询,实际底层就是多个term 查询,将多个term查询的结果给你封装到一起.
         *
         * @param column
         * @param text
         * @return
         */
        public static QueryBuilder match(String column, Object text) {
            return QueryBuilders.matchQuery(column, text);
        }
    
        /**
         * multiMatchQuery 针对多个field 进行检索,多个field对应一个文本。
         * <p>
         * 如:
         * text:北京, field: area, hometown 表示为搜索area含北京或hometown含北京的
         * </p>
         *
         * @param text
         * @param field
         * @return
         */
        public static QueryBuilder multiMatchQuery(Object text, String... field) {
            return QueryBuilders.multiMatchQuery(text, field);
        }
    
    
        /**
         * 根据_id查询
         *
         * @param ids 批量id
         * @return
         */
        public static QueryBuilder ids(String... ids) {
            return QueryBuilders.idsQuery().addIds(ids);
        }
    
        /**
         * 正则匹配。效率低下,非特殊情况不建议使用
         *
         * @param rgx 正则表达式
         * @return
         */
        public static QueryBuilder regexp(String field, String rgx) {
            return QueryBuilders.regexpQuery(field, rgx);
        }
    
        /**
         * 分页,相当于mysql的limit from, size
         *
         * @param from
         * @param size
         * @return
         */
        public ESQueryHelper limit(Integer from, Integer size) {
            this.source().from(from);
            this.source().size(size);
            return this;
        }
    
        /**
         * 从结果的第from条取
         *
         * @param from
         * @return
         */
        public ESQueryHelper from(Integer from) {
            this.source().from(from);
            return this;
        }
    
        /**
         * 从结果集获取size条
         *
         * @param size
         * @return
         */
        public ESQueryHelper size(Integer size) {
            this.source().size(size);
            return this;
        }
    
        /**
         * 按字段field倒序
         *
         * @param field
         * @return
         */
        public ESQueryHelper desc(String field) {
            this.source().sort(field, SortOrder.DESC);
            return this;
        }
    
        /**
         * 按字段field正序
         *
         * @param field
         * @return
         */
        public ESQueryHelper asc(String field) {
            this.source().sort(field, SortOrder.ASC);
            return this;
        }
    
        /**
         * 自定义查询条件的时候,如果设置该值不会再执复合查询
         * @param queryBuilder
         * @return
         */
        public ESQueryHelper searchCondition(QueryBuilder queryBuilder){
            this.condition = queryBuilder;
            return this;
        }
    
        /**
         * 执行查询
         *
         * @param client
         * @return
         * @throws IOException
         */
        public SearchResponse execute(RestHighLevelClient client) throws IOException {
            return this.execute(client, RequestOptions.DEFAULT);
        }
    
        /**
         * 执行查询
         *
         * @param client
         * @param requestOptions
         * @return
         * @throws IOException
         */
        public SearchResponse execute(RestHighLevelClient client, RequestOptions requestOptions) throws IOException {
            try {
                this.source().query(condition != null ? condition : bool);
                return client.search(this, requestOptions);
            } catch (IOException e) {
                logger.error("{}执行查询方法时发生异常: {}", this.getClass().getName(), e.getMessage());
                throw e;
            }
        }
    
    
        public static void main(String[] args) throws IOException {
            RestHighLevelClient client = null; // 你的es客户端对象
            SearchResponse searchResponse = ESQueryHelper.build("你的index")
                    .and(ESQueryHelper.equals("name", "张三")) // 名字为张三
                    .and(ESQueryHelper.between("age", 18, 28)) // 年龄在18~28之间
                    .not(ESQueryHelper.equals("gender", "女")) // 不能是女性
                    .or(ESQueryHelper.like("area", "北京"))// 或者是北京人
                    .size(10) // 只查询10条
                    .execute(client);// 异常自己处理
            // searchResponse.getHits().getHits() 结果自己处理
        }
    }
  • 相关阅读:
    今天面试一些程序员(新,老)手的体会
    UVA 10635 Prince and Princess
    poj 2240 Arbitrage
    poj 2253 Frogger
    poj 2485 Highways
    UVA 11258 String Partition
    UVA 11151 Longest Palindrome
    poj 1125 Stockbroker Grapevine
    poj 1789 Truck History
    poj 3259 Wormholes
  • 原文地址:https://www.cnblogs.com/huqi96/p/14883504.html
Copyright © 2011-2022 走看看