Java 使用OR操作在多个字段上执行ElasticSearch范围查询有何方法?
问题:获取在特定日期时间之后创建(字段:created_at)或更新(字段:updated_at)的文档 迄今为止的解决方案:使用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
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。。。从理论上讲,这应该是可行的,但它不起作用。我的命中率为零。