首页 > 解决方案 > 比较2个字段的elasticsearch查询(使用java)

问题描述

我的弹性搜索中有一个索引,我想要一个查询来比较 2 个日期字段。假设字段名称是creationDatemodifiedDate。我想获取这两个日期相同的所有文件。

我知道可以使用FilteredQuery现在已弃用的。类似于下面的代码:

FilteredQueryBuilder query = QueryBuilders.filteredQuery(null,
    FilterBuilders.scriptFilter("doc['creationDate'].value = doc['modifiedDate'].value"));

也可以将手动脚本编写为字符串,但我怀疑这是正确的解决方案。任何创建正确查询的想法将不胜感激。

标签: javaelasticsearch

解决方案


过滤的查询已被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");

推荐阅读