我在Elasticsearch中有一个索引,我想查询一个比较2个日期字段的查询。
假设字段名称为creationDatemodifiedDate。我想获取这两个日期相同的所有文档。

我知道可以使用现在不推荐使用的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"));

但是,与其在搜索时使用脚本,不如在索引编制时创建一个包含creationDatemodifiedDate是否为相同日期的信息的新字段更好。然后,您可以在查询时简单地检查该标志,它将更加优化和快速。

如果您不想为所有数据重新编制索引,则可以使用该标志更新所有数据,只需通过以下查询运行更新即可:

开机自检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");

08-18 05:21
查看更多