2017-04-10 3 views
0

Die Abfrage, um Benutzer zu finden Umsatz am 5. April gehört zu Delhi und hatte Anmeldungsveranstaltung am 5. April gemacht.Kann ich unter mysql Abfrage in elasticsearch dsl ändern?

SELECT sum (Umsatz) FROM order WHERE purchased_date = '2017.04.05 00.00.00' und Benutzer-ID in ( ein wählen. userId von Benutzern a, b Ereignis, wo a.userid = b. userid und a.city = 'Delhi' und b.time = '2017.04.05 00.00.00' und b.name = 'Registrierung')

Tables

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

Antwort

1

Ja, das ist machbar mit elastischen, b Zuerst müssen Sie Ihre Daten von der SQL-Tabelle zu dokumentenbasierten No-SQL-Daten modellieren.

Nested Dokument Ansatz

1) Sie eine Instanz von Datenmodell kann als

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

Für dieses Datenmodell folgt erhalten Sie auch Unterstützung Mappings

{ 
    "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" 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

hinzufügen müssen und schließlich können Sie die folgende Abfrage auslösen, um die gewünschten Ergebnisse zu erhalten

{ 
    "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" 
            } 
           } 
          }] 
         } 
        } 
       } 
      }] 
     } 
    } 
} 

für furthur Lesen Sie folgenden Links

mappings nested datatype

Eltern Kind Ansatz

Mappings

{ 
    "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" 
       } 
      } 
     } 
    } 
} 

Index Benutzer verweisen , Ordnung und Veranstaltungsunterlagen

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" 
} 

Abfrage

{ 
    "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" 
             } 
            } 
           }] 
          } 
         } 
        } 
       } 

      ] 
     } 
    } 
} 

diese link für furthur Lesung Siehe

hoffe, das hilft

+0

Können wir es Eltern-Kind-relationship.Where Benutzer als Eltern zu lösen, Bestell- und Ereignistabelle ist Kind des Benutzers und Schema ist das gleiche von allen Tabellen. – Sandy

+0

yeah Sie können, Eltern-Kind wird besser sein, wenn Sie eine große Anzahl von Bestellungen für jeden Benutzer haben, da die Größe des Dokuments im Limit sein wird – user3775217

+0

können Sie bitte Abfrage teilen, wenn ich Benutzer als Elternteil und Auftrag und Ereignis als a Kind und alle haben dasselbe Schema wie MySQL. – Sandy

Verwandte Themen