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() 结果自己处理
        }
    }
  • 相关阅读:
    ConcurrentHashMap
    Linux中如何开启8080端口供外界访问 和开启允许对外访问的端口8000
    CentOs 7 Linux系统下我的/etc/sysconfig/路径下无iptables文件
    CentOS7开启SSH服务
    Centos7下Samba服务器配置
    CentOS7(Linux)网络yum源配置
    Linux(Centos7)中配置Java环境变量
    SpringAOP-什么是面向切面编程?
    Swagger Demo
    自定义个Bean名称生成策略, 解决不同包下同名类问题/AnnotationBeanNameGenerator
  • 原文地址:https://www.cnblogs.com/huqi96/p/14883504.html
Copyright © 2011-2022 走看看