2016-08-26 28 views
1

我有這樣的文件在我的ElasticSearch指數:XML的標記值分組ElasticSearch文件(在一個字符串字段)

{ 
    "took" : 31, 
    "timed_out" : false, 
    "_shards" : { 
     "total" : 68, 
     "successful" : 68, 
     "failed" : 0 
    }, 
    "hits" : { 
     "total" : 9103, 
     "max_score" : 8.823501, 
     "hits" : [{ 
       "_index" : "ESB", 
       "_type" : "MDOrderFO", 
       "_id" : "AVaxDzEGBclOg4W8YiW1", 
       "_score" : 8.823501, 
       "_source" : { 
        "message" : "<root><flux>MyFlux</flux><requestId>123</requestId><timeStamp>2016-26-08T09:37:17</timeStamp><step>1</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
        "timestamp" : "2016-08-22T07:02:57.085Z", 
        "logger_name" : "MDOrderFOToFO" 
       } 
      }, { 
       "_index" : "ESB", 
       "_type" : "MDOrderFO", 
       "_id" : "AVaxDzEGBclOg4W8YiW1", 
       "_score" : 8.823501, 
       "_source" : { 
        "message" : "<root><flux>MyFlux</flux><requestId>123</requestId><timeStamp>2016-26-08T09:37:17</timeStamp><step>2</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
        "timestamp" : "2016-08-22T07:02:57.085Z", 
        "logger_name" : "MDOrderFOToFO" 
       } 
      }, { 
       "_index" : "ESB", 
       "_type" : "MDOrderFO", 
       "_id" : "AVaxDzEGBclOg4W8YiW1", 
       "_score" : 8.823501, 
       "_source" : { 
        "message" : "<root><flux>MyFlux</flux><requestId>123</requestId><timeStamp>2016-26-08T09:37:18</timeStamp><step>3</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
        "timestamp" : "2016-08-22T07:02:57.085Z", 
        "logger_name" : "MDOrderFOToFO" 
       } 
      }, { 
       "_index" : "ESB", 
       "_type" : "MDOrderFO", 
       "_id" : "AVaxDzEGBclOg4W8YiW1", 
       "_score" : 8.823501, 
       "_source" : { 
        "message" : "<root><flux>MyFlux</flux><requestId>123</requestId><timeStamp>2016-26-08T09:37:26</timeStamp><step>1</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
        "timestamp" : "2016-08-22T07:02:57.085Z", 
        "logger_name" : "MDOrderFOToFO" 
       } 
      }, { 
       "_index" : "ESB", 
       "_type" : "MDOrderFO", 
       "_id" : "AVaxDzEGBclOg4W8YiW1", 
       "_score" : 8.823501, 
       "_source" : { 
        "message" : "<root><flux>MyFlux</flux><requestId>456</requestId><timeStamp>2016-26-08T09:37:27</timeStamp><step>2</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
        "timestamp" : "2016-08-22T07:02:57.085Z", 
        "logger_name" : "MDOrderFOToFO" 
       } 
      }, { 
       "_index" : "ESB", 
       "_type" : "MDOrderFO", 
       "_id" : "AVaxDzEGBclOg4W8YiW1", 
       "_score" : 8.823501, 
       "_source" : { 
        "message" : "<root><flux>MyFlux</flux><requestId>456</requestId><timeStamp>2016-26-08T09:37:27</timeStamp><step>3</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
        "timestamp" : "2016-08-22T07:02:57.085Z", 
        "logger_name" : "MDOrderFOToFO" 
       } 
      }, { 
       "_index" : "ESB", 
       "_type" : "MDOrderFO", 
       "_id" : "AVaxDzEGBclOg4W8YiW1", 
       "_score" : 8.823501, 
       "_source" : { 
        "message" : "<root><flux>MyFlux</flux><requestId>456</requestId><timeStamp>2016-26-08T09:37:17</timeStamp><step>2</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
        "timestamp" : "2016-08-22T07:02:57.085Z", 
        "logger_name" : "MDOrderFOToFO" 
       } 
      } 
     ] 
    } 
} 

這裏是消息字段的XML格式:

<root> 
    <flux>MyFlux</flux> 
    <requestId>123</requestId> 
    <timeStamp>2016-26-08T09:37:17</timeStamp> 
    <step>2</step> 
    <status>ok</status> 
    <body><xml><myobject><field1>value1</field1></myobject></xml></body> 
</root> 

我想構建一個查詢,可以將我的文檔按RequestId值(位於消息字段的XML內容中)進行分組。 我預計這種答案:

{ 
    "took" : 31, 
    "timed_out" : false, 
    "_shards" : { 
     "total" : 68, 
     "successful" : 68, 
     "failed" : 0 
    }, 
    "hits" : { 
     "total" : 9103, 
     "max_score" : 8.823501, 
     "hits" : [...], 
     "aggregations" : { 
      "myaggs" : { 
       "doc_count_error_upper_bound" : 0, 
       "sum_other_doc_count" : 0, 
       "buckets" : [{ 
         "key" : "123", 
         "documents" : [{ 
           "_index" : "ESB", 
           "_type" : "MDOrderFO", 
           "_id" : "AVaxDzEGBclOg4W8YiW1", 
           "_score" : 8.823501, 
           "_source" : { 
            "message" : "<root><flux>MyFlux</flux><requestId>123</requestId><timeStamp>2016-26-08T09:37:17</timeStamp><step>1</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
            "timestamp" : "2016-08-22T07:02:57.085Z", 
            "logger_name" : "MDOrderFOToFO" 
           } 
          }, { 
           "_index" : "ESB", 
           "_type" : "MDOrderFO", 
           "_id" : "AVaxDzEGBclOg4W8YiW1", 
           "_score" : 8.823501, 
           "_source" : { 
            "message" : "<root><flux>MyFlux</flux><requestId>123</requestId><timeStamp>2016-26-08T09:37:17</timeStamp><step>2</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
            "timestamp" : "2016-08-22T07:02:57.085Z", 
            "logger_name" : "MDOrderFOToFO" 
           } 
          }, { 
           "_index" : "ESB", 
           "_type" : "MDOrderFO", 
           "_id" : "AVaxDzEGBclOg4W8YiW1", 
           "_score" : 8.823501, 
           "_source" : { 
            "message" : "<root><flux>MyFlux</flux><requestId>123</requestId><timeStamp>2016-26-08T09:37:18</timeStamp><step>3</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
            "timestamp" : "2016-08-22T07:02:57.085Z", 
            "logger_name" : "MDOrderFOToFO" 
           } 
          } 
         ] 
        }, { 
         "key" : "456", 
         "documents" : [{ 
           "_index" : "ESB", 
           "_type" : "MDOrderFO", 
           "_id" : "AVaxDzEGBclOg4W8YiW1", 
           "_score" : 8.823501, 
           "_source" : { 
            "message" : "<root><flux>MyFlux</flux><requestId>123</requestId><timeStamp>2016-26-08T09:37:26</timeStamp><step>1</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
            "timestamp" : "2016-08-22T07:02:57.085Z", 
            "logger_name" : "MDOrderFOToFO" 
           } 
          }, { 
           "_index" : "ESB", 
           "_type" : "MDOrderFO", 
           "_id" : "AVaxDzEGBclOg4W8YiW1", 
           "_score" : 8.823501, 
           "_source" : { 
            "message" : "<root><flux>MyFlux</flux><requestId>456</requestId><timeStamp>2016-26-08T09:37:27</timeStamp><step>2</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
            "timestamp" : "2016-08-22T07:02:57.085Z", 
            "logger_name" : "MDOrderFOToFO" 
           } 
          }, { 
           "_index" : "ESB", 
           "_type" : "MDOrderFO", 
           "_id" : "AVaxDzEGBclOg4W8YiW1", 
           "_score" : 8.823501, 
           "_source" : { 
            "message" : "<root><flux>MyFlux</flux><requestId>456</requestId><timeStamp>2016-26-08T09:37:27</timeStamp><step>3</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
            "timestamp" : "2016-08-22T07:02:57.085Z", 
            "logger_name" : "MDOrderFOToFO" 
           } 
          }, { 
           "_index" : "ESB", 
           "_type" : "MDOrderFO", 
           "_id" : "AVaxDzEGBclOg4W8YiW1", 
           "_score" : 8.823501, 
           "_source" : { 
            "message" : "<root><flux>MyFlux</flux><requestId>456</requestId><timeStamp>2016-26-08T09:37:17</timeStamp><step>2</step><status>ok</status><body><xml><myobject><field1>value1</field1></myobject></xml></body></root>", 
            "timestamp" : "2016-08-22T07:02:57.085Z", 
            "logger_name" : "MDOrderFOToFO" 
           } 
          } 
         ] 
        } 
       ] 
      } 
     } 
    } 
} 

我很新與ElasticSearch和我一個星期......花在這個在這個時候,我甚至不知道這是可能的。

我真的希望你能幫助我。 預先感謝您。

和當然,作爲一個法語的人,對不起我的英語

編輯
- 不幸的是,我不能編輯映射。我無法訪問將日誌保存到E.S.的過程的一部分。
- 實際上,我給出的格式與現實相比很簡單。在映射級別和XML內容中記錄了大量其他技術信息。 上下文:將日誌推入E.S.的BUS應用程序。有3個步驟(1:接收,2:路由,3:發送)。它記錄有關請求狀態(確定,失敗)以及在此請求中傳輸的對象的信息。 我正在處理的應用程序的目的是顯示所有已轉換的請求的業務信息是日期範圍的BUS應用程序。
所以在我的查詢,我想:
1.骨料通過的requestId我的日誌(每個組包含應該1個日誌在在在發送步驟的發送步驟和0或1日誌接收步驟中,0或1個對數)
2 。篩選的日誌的日期,得到的組在接收步驟
3.取第10組按日期降序

回答

0

一種方式來實現是通過修改數據庫架構有序。由於您的xml模式已修復,您可以將每個xml節點存儲在Elastic的單獨字段中,而不是將整個xml存儲在單個字段中。例如fluxrequestId,timeStamp等將映射到Elastic中的單獨字段(可能具有相同的名稱)。

+0

謝謝您的回答,但就像我在我的編輯說:我不能改變的映射:/ – MickaJsd

0

我不是100%確定要在這裏實現什麼,所以我會盡力指出一些事情,你可以考慮和/或嘗試:

您存儲在您的ES索引數據的方式是不非常友好的查詢,無論你想達到什麼目的。 我建議你打破文件XML和存儲各個屬性在不同的領域,如:

"_source" : { 
    "flux": "My Flux", 
    "requestId": 123, 
    "xml_timeStamp": "2016-26-08T09:37:17", 
    "step": 1, 
    "status": "ok", 
    "field1": "value1", 
    "timestamp" : "2016-08-22T07:02:57.085Z", 
    "logger_name" : "MDOrderFOToFO" 
} 

存儲你的數據就意味着你只需要使用一個value count aggregation爲聚合的這種方式。

爲了實現這一目標,您可能需要一種方法來打破XML文檔並將其映射到此新的ElasticSearch映射。

在這種情況下,您的聚集查詢看起來類似於:

{ 
    "aggs" : { 
     "myaggs" : { 
      "avg_price" : { "value_count" : { "field" : "requestId" } } 
     } 
    } 
} 

如果它是不可能爲你更新你的索引映射,我會建議尋找到regex filtering,包括在聚合查詢。

無論採用哪種方式,那些aggregations都不會向您返回每個存儲桶中的文檔。沒有好的用例想要返回Elasticsearch或任何其他類型數據庫中的所有文檔。這將是一個非常耗費內存的操作,而且速度很慢。

如果您希望按照requestId的順序返回文檔,請考慮將索引映射更改爲我上面建議的索引映射。然後使用sort返回您的數據。

讓我知道如果這能幫助:)

+0

謝謝你的回答,但就像我在說我的編輯:我無法更改映射:/ – MickaJsd

+0

因此,如果我設法使用RegExp在第一步中聚合RequestId,我應該首先查詢每個RequestId? – MickaJsd

+0

取決於你想達到什麼。如果你需要'requestId'命令列出的所有文件,那麼就使用我提到的'sort'。如果您需要具有特定'requestId'的所有文檔,則使用'regex'查詢來提取這些文檔。 –

相關問題