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() 结果自己处理
    }
}
原文地址:https://www.cnblogs.com/huqi96/p/14883504.html