Date_histogram Elasticsearch facet找不到字段

时间:2014-07-04 18:38:58

标签: elasticsearch histogram faceted-search facets

我正在使用date_histogram facet根据Epoch时间戳查找结果。结果显示在直方图上,x轴上的日期和y轴上的事件计数。这是我的代码不起作用:

angular.module('controllers', [])
  .controller('FacetsController', function($scope, $http) {
    var payload = {
      query: {
        match: {
          run_id: '9'
        }
      },
      facets: {
        date: {
          date_histogram: {
            field: 'event_timestamp',
            factor: '1000',
            interval: 'second'
          }
        }
      }
    }

如果我正在使用它是有效的     字段:'@ timestamp' 采用ISO8601格式;但是,我现在需要它使用Epoch时间戳。

以下是我的Elasticsearch中的一个示例,也许这会导致一些答案:

{"@version":"1",
"@timestamp":"2014-07-04T13:13:35.372Z","type":"automatic",
"installer_version":"0.3.0",
"log_type":"access.log","user_id":"1",
"event_timestamp":"1404479613","run_id":"9"}
},

当我运行它时,我收到此错误: POST 400 (Bad Request)

关于这里可能出现什么问题的任何想法?我不明白为什么我使用这两个不同的字段会有这样的区别,因为唯一的区别是格式。我尽可能地研究并发现我应该使用'因子',但这似乎并没有解决我的问题。我可能犯了一个愚蠢的初学者错误!

1 个答案:

答案 0 :(得分:0)

您需要先设置索引。 Elasticsearch擅长默认值,但它无法确定提供的值是时间戳,整数还是字符串。所以你的工作就是告诉Elasticsearch一样。

让我举例解释。让我们考虑以下文档是您要索引的内容:

{
   "@version": "1",
   "@timestamp": "2014-07-04T13:13:35.372Z",
   "type": "automatic",
   "installer_version": "0.3.0",
   "log_type": "access.log",
   "user_id": "1",
   "event_timestamp": "1404474613",
   "run_id": "9"
}

因此,最初您没有索引,并通过发出类似的HTTP请求来索引您的文档:

POST /test/date_experiments
{
   "@version": "1",
   "@timestamp": "2014-07-04T13:13:35.372Z",
   "type": "automatic",
   "installer_version": "0.3.0",
   "log_type": "access.log",
   "user_id": "1",
   "event_timestamp": "1404474613",
   "run_id": "9"
}

这将创建一个名为test的新索引和名为test的索引date_experiments中的新文档类型。

您可以通过以下方式检查此文档类型date_experiments的映射:

GET /test/date_experiments/_mapping

您在结果中得到的是由Elasticsearch生成的自动生成的映射:

{
   "test": {
      "date_experiments": {
         "properties": {
            "@timestamp": {
               "type": "date",
               "format": "dateOptionalTime"
            },
            "@version": {
               "type": "string"
            },
            "event_timestamp": {
               "type": "string"
            },
            "installer_version": {
               "type": "string"
            },
            "log_type": {
               "type": "string"
            },
            "run_id": {
               "type": "string"
            },
            "type": {
               "type": "string"
            },
            "user_id": {
               "type": "string"
            }
         }
      }
   }
}

请注意,event_timestamp字段的类型设置为string。这就是你date_histogram无效的原因。另请注意,@timestamp字段的类型已经date,因为您以标准格式推送日期,这使得Elasticsearch能够轻松识别您的意图是在该字段中推送日期。

通过向DELETE发送/test/date_experiments请求来删除此映射,然后从头开始。

这次我们不是先推送文档,而是根据我们的要求进行映射,以便将event_timestamp字段视为日期。

发出以下HTTP请求:

PUT /test/date_experiments/_mapping
{
   "date_experiments": {
      "properties": {
         "@timestamp": {
            "type": "date"
         },
         "@version": {
            "type": "string"
         },
         "event_timestamp": {
            "type": "date"
         },
         "installer_version": {
            "type": "string"
         },
         "log_type": {
            "type": "string"
         },
         "run_id": {
            "type": "string"
         },
         "type": {
            "type": "string"
         },
         "user_id": {
            "type": "string"
         }
      }
   }
}

请注意,我已将event_timestamp字段的类型更改为date。我没有指定格式,因为Elasticsearch擅长理解一些标准格式,例如@timestamp字段中您推送日期的情况。在这种情况下,Elasticsearch将能够理解您正在尝试推送UNIX时间戳并在内部将其转换为将其视为日期并允许对其进行所有日期操作。您可以在映射中指定日期格式,以防您推送的日期不是任何标准格式。

现在,您可以开始索引文档并开始运行日期查询和方面,就像您之前一样。

您应该详细了解mappingdate format