Itu awal yang bagus!
Saya pasti akan meratakan semuanya (yaitu denormalisasi ) dan buat dokumen produk yang terlihat seperti di bawah ini. Dengan begitu Anda menghilangkan hubungan N:M antara produk dan flag hanya dengan membuat flags
array untuk setiap produk. Dengan demikian akan lebih mudah untuk menanyakan tanda tersebut.
{
"id": "00c8234d71c4e94f725cd432ebc04",
"title": "Alpha",
"price": 589.0,
"flags": ["Sellout", "Top Product"]
}
{
"id": "018357657529fef056cf396626812",
"title": "Beta",
"price": 355.0,
"flags": ["Discount"]
}
{
"id": "01a2c32ceeff0fc6b7dd4fc4302ab",
"title": "Gamma",
"price": 0.0,
"flags": ["Discount"]
}
Jenis pemetaan produk akan terlihat seperti ini:
PUT products
{
"mappings": {
"product": {
"properties": {
"id": {
"type": "string",
"index": "not_analyzed"
},
"title": {
"type": "string"
},
"price": {
"type": "double",
"null_value": 0.0
},
"flags": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
Karena Anda memiliki jdbc
logstash masukan sudah, semua yang Anda lewatkan adalah kueri SQL yang tepat untuk mengambil produk dan tanda terkait.
SELECT p.Id as id, p.Title as title, p.Price as price, GROUP_CONCAT(f.Title) as flags
FROM Products p
JOIN flagsProducts fp ON fp.ProductId = p.Id
JOIN Flags f ON fp.FlagId = f.id
GROUP BY p.Id
Yang akan membuat Anda mendapatkan baris seperti ini:
+-------------------------------+-------+-------+---------------------+
| id | title | price | flags |
+-------------------------------+-------+-------+---------------------+
| 00c8234d71c4e94f725cd432ebc04 | Alpha | 589 | Sellout,Top product |
| 018357657529fef056cf396626812 | Beta | 355 | Discount |
| 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0 | Discount |
+-------------------------------+-------+-------+---------------------+
Dengan menggunakan filter Logstash, Anda kemudian dapat membagi flags
ke dalam array dan Anda siap melakukannya.