高效开发:ES使用QueryBuilders查询索引库

Posted 爱奇志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高效开发:ES使用QueryBuilders查询索引库相关的知识,希望对你有一定的参考价值。


QueryBuilder 是es中提供的一个查询接口

private SearchResponse getApiResponseByDetail(SearchRequestBuilder responseBuilder,String condition) {
        String time1 = "2020-01-02T00:00:00.000Z";
        String time2 = "2020-01-02T15:59:59.000Z";
        RangeQueryBuilder rangequerybuilder = QueryBuilders
                //传入时间,目标格式2020-01-02T03:17:37.638Z
                .rangeQuery("@timestamp")
                .from(time1).to(time2);
 
        SearchResponse searchResponse = responseBuilder.setQuery(
                QueryBuilders.boolQuery()
                       //must表示and
                       .must(rangequerybuilder) //根据时间范围查询
                       .must(QueryBuilders.existsQuery("api_id"))
                       .must(QueryBuilders.matchPhraseQuery("detail", condition))
        ).setExplain(true).execute().actionGet();
        return searchResponse;
    }

注意:es存储日志 是按照UTC时间格式存放,以@timestamp 作为时间范围查询条件,即from(Date1) to(Date2)Date1、Date2入参必须是标准的utc格式;

1、BoolQuery( ) 用于组合多个叶子或复合查询子句的默认查询

must 相当于 与 & =
must not 相当于 非 ~ !=
should 相当于 或 | or
filter 过滤

boolQuery().must(termQuery("content", "test1"))
           .must(termQuery("content", "test4")) 
           .mustNot(termQuery("content", "test2"))
           .should(termQuery("content", "test3"))
           .filter(termQuery("content", "test5"));

2、Elasticsearch java api 常用查询方法QueryBuilder构造举例

精确查询(数字+字符串)

以下字段名用 f i e l d N a m e 代 替 , 具 体 值 用 {fieldName}代替,具体值用 fieldName{fieldValue}代替

1、数字

//单个
QueryBuilder qb1 = QueryBuilders.termQuery("${fieldName}", "${fieldValue}");
 
//批量
QueryBuilder qb1 = QueryBuilders.termsQuery("${fieldName}", "${fieldValues}");

2、字符串

//单个
QueryBuilder qb1 = QueryBuilders.termQuery("${fieldName}.keyword", "${fieldValue}");
 
//批量
QueryBuilder qb1 = QueryBuilders.termsQuery("${fieldName}.keyword", "${fieldValues}");

模糊查询(字符串)

1、数字

数字查询都为精确查询,没有模糊查询,模糊查询都是字符串

2、字符串

QueryBuilder qb1 = QueryBuilders.moreLikeThisQuery(new String[]{"${fieldName}"}, new String[]{"${fieldValue}"}, null);

范围查询(数字)

//闭区间查询
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}).to(${fieldValue2}); 
 
//开区间查询
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}, false).to(${fieldValue2}, false);
 
//大于
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").gt(${fieldValue});
 
 //大于等于
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").gte(${fieldValue}); 
 
//小于
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").lt(${fieldValue}); 
 
//小于等于
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").lte(${fieldValue});

多条件查询

QueryBuilder qb1 = QueryBuilders.moreLikeThisQuery(new String[]{"${fieldName1}"}, new String[]{"${fieldValue1}"}, null);
QueryBuilder qb2 = QueryBuilders.rangeQuery("${fieldName2}").gt("${fieldValue2}");
QueryBuilder qb3 = QueryBuilders.boolQuery().must(qb1).must(qb2);

以上是关于高效开发:ES使用QueryBuilders查询索引库的主要内容,如果未能解决你的问题,请参考以下文章

springBoot集成es查询,使用ElasticsearchTemplate执行滚动查询

elasticsearch基本操作之--使用QueryBuilders进行查询

es查询条件构造

elastic querybuilders怎么添加多个参数

elasticsearch基本操作之--使用QueryBuilders进行查询

高效的 SQL 查询或索引来查找所有列是不是只有 1 个值