2017-04-10 57 views
0

查詢5月4日查詢用戶收入屬於德里,並於4月5日完成註冊事件。我可以在mysql查詢之下更改爲elasticsearch dsl嗎?

SELECT SUM(收入)FROM order WHERE purchased_date = '2017年4月5日00:00:00' 和用戶ID在( 從用戶選擇一個。userId,事件b其中a.userid = B。用戶ID和a.city = '德里' 和b.time = '2017年4月5日00:00:00' 和b.name = '註冊')

Order 
id purchasedDate  revenue userId 
    1 2017-04-05 00:00:00 30  1 
    2 2017-04-06 00:00:00 30  1 
    3 2017-04-05 00:00:00 80  2 
    1 2017-04-06 00:00:00 70  2 
    1 2017-04-05 00:00:00 60  3 
    1 2017-04-06 00:00:00 40  3 
    1 2017-04-07 00:00:00 50  3 
    1 2017-04-07 00:00:00 30  3 
User 
id city 
    1 delhi 
    2 noida 
    3 delhi 
Event 
userid name   time 
    1  signup 2017-04-05 00:00:00 
    2  signup 2017-04-05 00:00:00 
    3  signup 2017-04-05 00:00:00

回答

1

是的,這是可以用彈性,b首先,你必須將你的數據從SQL表建模到基於文檔的no-sql數據。

嵌套文檔的方法

1)可以按如下

{ 
    "purchasedDate": "2017-04-05", 
    "revenue": 30, 
    "user": { 
     "id": 1, 
     "city": "delhi", 
     "event": [{ 
      "name": "signup", 
      "time": "2017-04-05" 
     }] 
    } 
} 

對於這個數據模型數據的一個實例模型,你還需要增加配套映射

{ 
    "mappings": { 
     "type_name": { 
      "properties": { 
       "purchasedDate": { 
        "type": "date" 
       }, 
       "revenue": { 
        "type": "integer" 
       }, 
       "user": { 
        "type": "object", 
        "properties": { 
         "id": { 
          "type": "integer" 
         }, 
         "city": { 
          "type": "text" 
         }, 
         "event": { 
          "type": "nested", 
          "properties": { 
           "name": { 
            "type": "text" 
           }, 
           "time": { 
            "type": "date" 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

最後你可以啓動下面的查詢來獲得想要的結果

{ 
    "size": 0, 
    "aggs": { 
     "revenue_sum": { 
      "sum": { 
       "field": "revenue" 
      } 
     } 
    }, 
    "query": { 
     "bool": { 
      "must": [{ 
       "term": { 
        "purchasedDate": { 
         "value": "2017-04-05" 
        } 
       } 
      }, { 
       "term": { 
        "user.city": { 
         "value": "delhi" 
        } 
       } 
      }, { 
       "nested": { 
        "path": "user.event", 
        "query": { 
         "bool": { 
          "must": [{ 
           "term": { 
            "user.event.name": { 
             "value": "signup" 
            } 
           } 
          }, { 
           "term": { 
            "user.event.time": { 
             "value": "2017-04-05" 
            } 
           } 
          }] 
         } 
        } 
       } 
      }] 
     } 
    } 
} 

爲furthur閱讀,你可以參考以下鏈接

mappings nested datatype

親子方法

映射

{ 
    "mappings": { 
     "user": { 
      "properties": { 
       "city": { 
        "type": "text" 
       } 
      } 
     }, 
     "event": { 
      "_parent": { 
       "type": "user" 
      }, 
      "properties": { 
       "name": { 
        "type": "text" 
       }, 
       "time": { 
        "type": "date" 
       } 
      } 
     }, 
     "order": { 
      "_parent": { 
       "type": "user" 
      }, 
      "properties": { 
       "purchasedDate": { 
        "type": "date" 
       }, 
       "revenue": { 
        "type": "integer" 
       } 
      } 
     } 
    } 
} 

指數用戶,爲了和事件的文件

POST data_play2/user/1 
{ 
    "city":"london" 
} 

POST data_play2/order/10?parent=1 
{ 
    "purchasedDate":"2017-04-05", 
    "revenue": 100 
} 

POST data_play2/event/1?parent=1 
{ 
    "userid" : 1, 
    "name" : "signup", 
    "time" : "2017-04-05" 
} 

查詢

{ 
    "size": 0, 
    "aggs": { 
     "revenue": { 
      "children": { 
       "type": "order" 
      }, 
      "aggs": { 
       "filtered_order": { 
        "filter": { 
         "bool": { 
          "must": [{ 
           "term": { 
            "purchasedDate": { 
             "value": "2017-04-05" 
            } 
           } 
          }] 
         } 
        }, 
        "aggs": { 
         "revenue_sum": { 
          "sum": { 
           "field": "revenue" 
          } 
         } 
        } 
       } 
      } 
     } 
    }, 
    "query": { 
     "bool": { 
      "must": [{ 
        "term": { 
         "city": { 
          "value": "london" 
         } 
        } 
       }, { 
        "has_child": { 
         "type": "order", 
         "query": { 
          "bool": { 
           "must": [{ 
            "term": { 
             "purchasedDate": { 
              "value": "2017-04-05" 
             } 
            } 
           }] 
          } 
         } 
        } 
       }, { 
        "has_child": { 
         "type": "event", 
         "query": { 
          "bool": { 
           "must": [{ 
            "term": { 
             "name": { 
              "value": "signup" 
             } 
            } 
           }, { 
            "term": { 
             "time": { 
              "value": "2017-04-05" 
             } 
            } 
           }] 
          } 
         } 
        } 
       } 

      ] 
     } 
    } 
} 

請參閱本link爲furthur閱讀

希望這有助於

+0

我們能解決父子relationship.Where用戶作爲父母,順序和事件表是用戶的子項,架構與所有表相同。 – Sandy

+0

是啊,你可以,親子會更好,如果你有大量的訂單爲每個用戶作爲文件的大小將在限制 – user3775217

+0

可以請你分享查詢,如果我有用戶作爲父母和訂單和事件作爲孩子和所有的模式都與mysql相同。 – Sandy