php - Elasticsearch查询日期排序父子关系(重复事件)

标签 php sorting elasticsearch parent-child dsl

我目前正在开发一个用于处理事件的应用程序。
因此,在Elasticsearch中,我们确实有一个名为Event的文档。

以前,我们只有一种事件(发生在5月13日上午9点到11点之间的唯一事件),排序很简单(按start_date排序)

最近,我们添加了一项新功能,该功能使我们可以创建重复事件,这意味着我们现在在Elasticsearch内部拥有2个级别(父子关系)。

我们可以举办一个家长 Activity ,例如从5月12日下午2点到5月14日下午6点,与该事件相关联,例如,我们有每天的 child 。因此,我们有:5月12日2 PM-6PM,5月13日2 PM-6PM,5月14日2 PM-6PM。

实际排序的问题在于,当我们在5月12日晚上10点时,会在列表顶部找到重复发生的事件,此后便是唯一事件。

我想进行排序,以最近的日期为优先。在这种情况下,唯一事件应该是列表中的第一个事件。

为了实现这一点,我为循环事件父节点上的节点子节点建立了索引,以使子节点start_date生效。
这样做的想法是从子节点中获取每个重复事件的最近日期,并使用每个唯一事件的start_date对该日期进行排序。

我对Elasticsearch的经验不多,所以有点困惑,我在文档中看到了很多信息(父子,嵌套对象,脚本等),但我不知道如何处理案件。

如果您有任何问题,希望我能正确解释,请随时提出,我们很乐意为您提供更多信息。

最佳答案

对于 future 的Google员工,这是我的解决方法。

必须使用脚本并对其进行排序,这是我正在使用的请求的部分示例

GET /event/_search
{
    "query" : {
      "match_all": {}
    },
    "sort" : {
        "_script" : {
            "type" : "number",
            "script": {
              "lang": "painless",
              "params": {
                "currentDate": 1560230000
              },
              "source": """
                def isRecurrenceParent = params._source.is_recurrence_parent;
                def countChildren = params._source.children.length;
                def currentDate = params.currentDate;

                if (isRecurrenceParent === false) {
                  return params._source.timestamp;
                }

                def nearest = 0;

                def lowestDiff = currentDate;

                for (int i = 0; i < countChildren; i++) {
                  def child = params._source.children[i];

                  def diff = child.timestamp - currentDate;
                  if (diff > 0 && diff < lowestDiff) {
                    lowestDiff = diff;
                    nearest = child.timestamp;
                  }
                }

                return nearest;
"""
            },
            "order" : "asc"
        }
    }
}

关于php - Elasticsearch查询日期排序父子关系(重复事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56217069/

相关文章:

php - Symfony2 : Redirecting to last route and flash a message?

elasticsearch - 使用带文件拍的logstash时出现权限错误

elasticsearch - 通过Logstash输入数据之前,我应该定义我的ElasticSearch映射吗?

Elasticsearch:聚合数组中的不同值

PHP session 在刷新时不保存

php - 在 PHP 的 foreach 循环中使用更新 SQL 查询

java对数组进行排序,其位置很重要

scala - 如何对RDD进行排序

java - 删除重复项并对字符串数组进行排序

php - while 循环中的 strpos() 永远不会结束