弹性搜索嵌入式脚本优化

时间:2014-12-19 11:27:41

标签: elasticsearch

有没有办法简化和优化以下查询:

{
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "range": {
              "ts": {
                "gte": "2014-12-18",
                "lte": "2014-12-18"
              }
            }
          }
        ]
      },
      "query": {
        "match": {
          "track_events.event": "render"
        }
      }
    }
  },
  "aggs": {
    "per_type": {
      "terms": {
        "field": "type",
        "order": {
          "_count": "desc"
        },
        "size": 0
      },
      "aggs": {
        "per_hour": {
          "terms": {
            "script": "(doc[\"track_events.ts\"].value - doc[\"ts\"].value)/(1000 * 3600)",
            "order": {
              "_count": "desc"
            },
            "size": 0
          }
        }
      }
    }
  }
}

elasticsearch中的索引包含包含字段track_events.tsts的文档。目的是计算track_events.tsts之间每小时间隔内存在的出现次数。 回复示例:

                "buckets": [{
                    "key": "0",
                    "doc_count": 67736997
                },
                {
                    "key": "1",
                    "doc_count": 7193214
                },
                {
                    "key": "2",
                    "doc_count": 3406966
                },
                {
                    "key": "3",
                    "doc_count": 1988135
                }]
            }

表示67736997计算的时间差小于1小时,7193214计算时差小于2小时等等。

1 个答案:

答案 0 :(得分:0)

最大的性能提升是替换脚本。

即。而不是做:

(doc[\"track_events.ts\"].value - doc[\"ts\"].value)/(1000 * 3600)

在将数据加载到Elasticsearch并将其放入另一个字段时预先计算此值。然后在此字段上执行术语聚合。