elasticsearch DSL java api总结

本文详细介绍了如何使用Elasticsearch的Java API进行DSL查询,包括query和filter的区别与应用场景,term级别的各种query,全文query以及DSL的组合方式如bool和boosting查询。文中通过具体的Java代码示例展示了如何构建复杂的查询条件。
摘要由CSDN通过智能技术生成

引言

DSL,叫“特定领域语言”,是针对某一领域,具有受限表达性的一种计算机程序设计语言。elasticsearch的 query DSL即是针对elasticsearch检索的一种特定语言。
es的DSL在使用java API访问es时候也特别好用,本文我们详细了解下es的DSL java API的使用。
在使用java api检索es时候,我们使用的方式是:

            QueryBuilder builders = null;// 重点讲这个的构造
            SearchResponse response = client.prepareSearch(index)
                    .setFrom(0).setSize(100)
                    .setTimeout(TimeValue.timeValueMillis(300))
                    .setFetchSource(retFields, null)
                    .setQuery(builders)
                    .setTypes(type)
                    .execute().actionGet();

上面查询API中的setQuery就是指定查询的DSL,也是本文主要讲的。
es版本:5.1.x

query和filter

我们知道,es的查询分为两种query和filter,两种不同的上下文环境用于不同的目的。

query

使用上下文

query字句解决的问题是“文档和查询字句匹配程度”,并通过一个score分数来具体表示匹配程度。

query子句查询生效条件

直接在search API中指定query参数(通过setQuery),比如设置如下:

SearchRequestBuilder requestBuilder = client.prepareSearch(index);
requestBuilder.setQuery(QueryBuilders.termQuery("val", "field"));  // 指定query,使用的是query上下文
System.out.println(requestBuilder.toString());                     // 打印查询语句 
SearchResponse response = requestBuilder.execute().actionGet();    // 执行query

在上例中,我们通过设置query参数,使用的就是query上下文查询。如果通过toString方法打印出来,如下:

"query" : {
    "term" : {
      "field" : {
        "value" : "val",
        "boost" : 1.0
      }
    }
  }

filter

使用上下文

filter字句解决的问题是“文档和查询字句是否匹配”,只有两种情况YES和NO,不会计算分数。filter字句常用来过滤结构型数据,比如:

  • 是否时间字段timestamp处于2015和2016之间
  • 是否status字段被设置为true

另外,filter查询会被es缓存到内存以提高性能。

filter字句查询生效条件

触发filter上下文有三种情况:

  • 在bool查询中指定filter参数或者must_not参数;
  • 在 constant_score查询中指定filter参数;
  • filter aggregation,即filter聚合查询;

示例

如下一段查询语句:

GET /_search
{
  "query": { (1"bool": { (2"must": [
        { "ma
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值