elasticseach查询比较两个字段(使用java)

时间:2018-11-04 18:38:25

标签: java elasticsearch

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

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

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

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

1 个答案:

答案 0 :(得分:2)

已过滤的查询已替换为bool/filter个查询,您可以这样做:

BoolQueryBuilder bqb = QueryBuilders.boolQuery()
    filter(QueryBuilders.scriptQuery("doc['creationDate'].value = doc['modifiedDate'].value"));

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

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

发布我的索引/ _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");