我在Elasticsearch中有一个索引,我想查询一个比较2个日期字段的查询。
假设字段名称为creationDate
和modifiedDate
。我要获取这两个日期相同的所有文档。
我知道现在可以使用不推荐使用的FilteredQuery
。
类似于下面的代码:
FilteredQueryBuilder query = QueryBuilders.filteredQuery(null,
FilterBuilders.scriptFilter("doc['creationDate'].value = doc['modifiedDate'].value"));
也可以将手动脚本编写为字符串,但是我怀疑这是正确的解决方案。任何想法来创建正确的查询将不胜感激。
答案 0 :(得分:2)
已过滤的查询已替换为bool/filter
个查询,您可以这样做:
BoolQueryBuilder bqb = QueryBuilders.boolQuery()
filter(QueryBuilders.scriptQuery("doc['creationDate'].value = doc['modifiedDate'].value"));
但是,与其在搜索时使用脚本,不如在索引编制时创建一个包含creationDate
和modifiedDate
是否为相同日期的信息的新字段更好。然后,您只需在查询时检查该标志,它就会更加优化和快速。
如果您不想为所有数据重新编制索引,则可以使用该标志更新所有数据,只需通过如下查询通过运行更新即可:
发布我的索引/ _update_by_query
{
"script": {
"source": """
def creationDate = Instant.parse(ctx._source.creationDate);
def modifiedDate = Instant.parse(ctx._source.modifiedDate);
ctx._source.modified = ChronoUnit.MICROS.between(creationDate, modifiedDate) > 0;
""",
"lang": "painless"
},
"query": {
"match_all": {}
}
}
然后您的查询将简单地
BoolQueryBuilder bqb = QueryBuilders.boolQuery()
filter(QueryBuilders.termQuery("modified", "false");