java - 比较2个字段的elasticsearch查询(使用java)
问题描述
我的弹性搜索中有一个索引,我想要一个查询来比较 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
然后,您可以在查询时简单地检查该标志,它会更加优化和快速。
如果您不想重新索引所有数据,则可以使用该标志更新所有数据,只需通过查询运行更新,如下所示:
发布我的索引/_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");