我在Elasticsearch中有一个索引,我想查询一个比较2个日期字段的查询。
假设字段名称为creationDate
和modifiedDate
。我想获取这两个日期相同的所有文档。
我知道可以使用现在不推荐使用的FilteredQuery
。
类似于下面的代码:
FilteredQueryBuilder query = QueryBuilders.filteredQuery(null,
FilterBuilders.scriptFilter("doc['creationDate'].value = doc['modifiedDate'].value"));
也可以将手动脚本编写为字符串,但是我怀疑这是正确的解决方案。任何想法来创建正确的查询将不胜感激。
最佳答案
过滤的查询已被bool/filter
查询取代。您可以这样操作:
BoolQueryBuilder bqb = QueryBuilders.boolQuery()
filter(QueryBuilders.scriptQuery("doc['creationDate'].value = doc['modifiedDate'].value"));
但是,与其在搜索时使用脚本,不如在索引编制时创建一个包含
creationDate
和modifiedDate
是否为相同日期的信息的新字段更好。然后,您可以在查询时简单地检查该标志,它将更加优化和快速。如果您不想为所有数据重新编制索引,则可以使用该标志更新所有数据,只需通过以下查询运行更新即可:
开机自检my-index / _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");