Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用OR操作在多个字段上执行ElasticSearch范围查询有何方法?_Java_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java 使用OR操作在多个字段上执行ElasticSearch范围查询有何方法?

Java 使用OR操作在多个字段上执行ElasticSearch范围查询有何方法?,java,elasticsearch,Java,elasticsearch,问题:获取在特定日期时间之后创建(字段:created_at)或更新(字段:updated_at)的文档 迄今为止的解决方案:使用 boolQueryBuilder.must(QueryBuilders.rangeQuery("after.created_at").gte(timeInMillis * 1000)); boolQueryBuilder.must(QueryBuilders.rangeQuery("after.updated_a

问题:获取在特定日期时间之后创建(字段:created_at)或更新(字段:updated_at)的文档

迄今为止的解决方案:使用

boolQueryBuilder.must(QueryBuilders.rangeQuery("after.created_at").gte(timeInMillis * 1000));
            boolQueryBuilder.must(QueryBuilders.rangeQuery("after.updated_at").gte(timeInMillis * 1000));

我得到以下查询:

"query":  {
  "bool" : {
    "must" : [
      {
        "wrapper" : {
          "query" : "eyJib29sIjp7Im11c3Rfbm90IjpbeyJtYXRjaCI6eyJhZnRlci50aXRsZSI6eyJxdWVyeSI6IldOQkEiLCJvcGVyYXRvciI6ImFuZCJ9fX0seyJtYXRjaCI6eyJmaWVsZC5kZXNjcmlwdGlvbiI6eyJxdWVyeSI6IldOQkEiLCJvcGVyYXRvciI6ImFuZCJ9fX1dLCJzaG91bGQiOlt7Im1hdGNoIjp7ImFmdGVyLnRpdGxlIjoiZmluYWxzIn19LHsibWF0Y2giOnsiZmllbGQuZGVzY3JpcHRpb24iOiJmaW5hbHMifX1dfX0="
        }
      },
      {
        "range" : {
          "after.created_at" : {
            "from" : 1603332110000000,
            "to" : null,
            "include_lower" : true,
            "include_upper" : true,
            "boost" : 1.0
          }
        }
      },
      {
        "range" : {
          "after.updated_at" : {
            "from" : 1603332110000000,
            "to" : null,
            "include_lower" : true,
            "include_upper" : true,
            "boost" : 1.0
          }
        }
      }
    ]
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}
}
(忽略开头的包装查询)

问题是,在1603332110000000之后创建和更新文档的地方,它的点击率越来越高。 我如何构建查询,以便在1603332110000000之后创建或更新文档?或者在一个查询中无法实现,我必须为此执行两个查询


谢谢

必须与逻辑AND运算符相同,且应与逻辑OR运算符相同

您需要使用
should
子句

{
  "query": {
    "bool": {
      "must": [
        {
          "wrapper": {
            "query": "eyJib29sIjp7Im11c3Rfbm90IjpbeyJtYXRjaCI6eyJhZnRlci50aXRsZSI6eyJxdWVyeSI6IldOQkEiLCJvcGVyYXRvciI6ImFuZCJ9fX0seyJtYXRjaCI6eyJmaWVsZC5kZXNjcmlwdGlvbiI6eyJxdWVyeSI6IldOQkEiLCJvcGVyYXRvciI6ImFuZCJ9fX1dLCJzaG91bGQiOlt7Im1hdGNoIjp7ImFmdGVyLnRpdGxlIjoiZmluYWxzIn19LHsibWF0Y2giOnsiZmllbGQuZGVzY3JpcHRpb24iOiJmaW5hbHMifX1dfX0="
          }
        }
      ],
      "should": [
        {
          "range": {
            "after.created_at": {
              "from": 1603332110000000,
              "to": null,
              "include_lower": true,
              "include_upper": true,
              "boost": 1.0
            }
          }
        },
        {
          "range": {
            "after.updated_at": {
              "from": 1603332110000000,
              "to": null,
              "include_lower": true,
              "include_upper": true,
              "boost": 1.0
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1.0
    }
  }
}

使用时应使用最小数字应匹配:

BoolQueryBuilder orQuery = QueryBuilders.boolQuery();
orQuery.should(QueryBuilders.rangeQuery("after.created_at").gte(timeInMillis * 1000));
orQuery.should(QueryBuilders.rangeQuery("after.updated_at").gte(timeInMillis * 1000));
orQuery.minimumNumberShouldMatch(1);

谢谢你的回答。这是有道理的。但是,这样做会给我所有的文档提供空值,因为我使用的两个字段都可以为空
“updated_by”:null,“created_at”:null,
也尝试在两个字段中使用existsQuery,但我的点击率为零
boolQueryBuilder.must(QueryBuilders.existsQuery(“after.created\u at”))
Hmm。。。从理论上讲,这应该是可行的,但它不起作用。我的命中率为零。