鍍金池/ 問答/Java/ elasticsearch json聚合搜索

elasticsearch json聚合搜索

現(xiàn)在有一個(gè)需求,需要對(duì)用戶操作進(jìn)行統(tǒng)計(jì),因?yàn)閿?shù)據(jù)丟在mysql里面必定會(huì)有很大的數(shù)據(jù)量,所以準(zhǔn)備用elasticsearch。目前碰到一個(gè)問題,直接貼出結(jié)構(gòu)

{
  "_index": "test_vpn_operation-2018-04-08",
  "_type": "vpn_operation",
  "_id": "AWKiw45UfMhbLGkLP-v3",
  "_score": null,
  "_source": {
    "app_version": "2.0.0",
    "dateline": 1523149062,
    "channel": "pc",
    "edition": "jichu",
    "message": "{\"date_time\":\"2018-04-08T08:59:07\",\"account_id\":447189,\"operation\":[{\"account_id\":\"447189\",\"operation_id\":1,\"timestamp\":1523149062},{\"account_id\":\"447189\",\"operation_id\":1,\"timestamp\":1523149063}],\"channel\":\"pc\",\"edition\":\"jichu\",\"app_version\":\"2.0.0\",\"dateline\":1523149062}",
    "type": "vpn_operation",
    "path": "/data/wwwroot/vpnApi/elklog/vpn_operation_record_20180408",
    "@timestamp": "2018-04-08T00:59:07.722Z",
    "account_id": 447189,
    "date_time": "2018-04-08T08:59:07",
    "@version": "1",
    "host": "JG-otter",
    "operation": [
      {
        "operation_id": 1,
        "account_id": "447189",
        "timestamp": 1523149062
      },
      {
        "operation_id": 1,
        "account_id": "447189",
        "timestamp": 1523149063
      }
    ]
  },
  "fields": {
    "date_time": [
      1523177947000
    ],
    "@timestamp": [
      1523149147722
    ]
  },
  "highlight": {
    "message": [
      "{\"date_time\":\"2018-04-08T08:59:@kibana-highlighted-field@07@/kibana-highlighted-field@\",\"account_id\":447189,\"operation\":[{\"account_id\":\"447189\",\"operation_id\":1,\"timestamp\":1523149062},{\"account_id\":\"447189\",\"operation_id\":1,\"timestamp\":1523149063}],\"channel\":\"pc\",\"edition\":\"jichu\",\"app_version\":\"2.0.0\",\"dateline\":1523149062}"
    ]
  },
  "sort": [
    1523149147722
  ]
}

本來想通過聚合operation.operation_id實(shí)現(xiàn)mysql類似于group by的統(tǒng)計(jì)操作,但是發(fā)現(xiàn)數(shù)據(jù)不準(zhǔn)確。因?yàn)閛peration下面并不存在operation_id這個(gè)字段,有什么方法可以達(dá)到類似的需求,或者我這邊需要如何調(diào)整結(jié)構(gòu),以實(shí)現(xiàn)需求

回答
編輯回答
命多硬

猜測(cè)1: 你是不是設(shè)置 mapping 的時(shí)候, 對(duì)該對(duì)象數(shù)組采用了 object 類型的索引, 這應(yīng)該就是應(yīng)對(duì)嵌套文檔的默認(rèn)策略. 如果使用的是 object 類型的索引, 那么對(duì)象數(shù)組會(huì)被拍平. 參見如下三篇官方文檔:

內(nèi)部對(duì)象數(shù)組
嵌套對(duì)象
嵌套對(duì)象映射

猜測(cè)2: 是不是你的一部分文檔沒有 operation.operation_id 這個(gè)字段, 導(dǎo)致結(jié)果不準(zhǔn)確. 這時(shí)可以對(duì)該字段設(shè)置默認(rèn)值. 官方文檔: missing value

猜測(cè)3: 是不是 operation.operation_id 這個(gè)字段在所有文檔中有多種類型. 比如最開始存了 int, 后來存了 string. 我反正常干這事, 因?yàn)槲业纳嫌螖?shù)據(jù)源是日志, 日志里的字段更改是常事. 我的做法是, 只查更改后的那部分索引, 因?yàn)? mapping 更改規(guī)則生效是在新索引建立, 比如3月1日改 mapping, 那么 index-2018-03-02 這個(gè)索引規(guī)則才會(huì)生效, 此時(shí)如果跨索引查詢, 比如查詢整個(gè)3月, 則會(huì)出問題. 此時(shí)可以查詢3月2日至3月31日.

2017年10月12日 14:18