Jan*_*ter 13 php mysql data-structures elasticsearch logstash
最近,我开始将ElasticSearch(ES)实现用于使用MySQL用PHP编写的遗留电子商务应用程序.我对所有这些东西都是全新的,阅读文档很好,但我真的需要有经验的人来建议我.
从ES文档我能够设置一个新的集群,我还发现河流已被弃用,应该被替换,所以我用Logstash和JDBC MySQL连接器替换它们.
此时我有:
应用程序的数据库结构并不是最佳的,并且很难替换,但我想以最佳方式将其复制到ES索引中.
数据库结构:
制品
+-------------------------------+-------+--------+
| Id | Title | Price |
+-------------------------------+-------+--------+
| 00c8234d71c4e94f725cd432ebc04 | Alpha | 589,00 |
| 018357657529fef056cf396626812 | Beta | 355,00 |
| 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0,00 |
+-------------------------------+-------+--------+
Run Code Online (Sandbox Code Playgroud)
旗
+------------+-------------+
| Id | Title |
+------------+-------------+
| sellout | Sellout |
| discount | Discount |
| topproduct | Top Product |
+------------+-------------+
Run Code Online (Sandbox Code Playgroud)
flagsProducts(n:m pivot)
+------+-------------------------------+------------+------------+
| Id | ProductId | FlagId | ExternalId |
+------+-------------------------------+------------+------------+
| 1552 | 00c8234d71c4e94f725cd432ebc04 | sellout | NULL |
| 2845 | 00c8234d71c4e94f725cd432ebc04 | topproduct | NULL |
| 9689 | 018357657529fef056cf396626812 | discount | NULL |
| 4841 | 01a2c32ceeff0fc6b7dd4fc4302ab | discount | NULL |
+------+-------------------------------+------------+------------+
Run Code Online (Sandbox Code Playgroud)
那些字符串ID是完全的灾难(但我现在必须处理它们).起初我以为我应该对ES的产品索引进行扁平结构,但是多个实体绑定呢?
Val*_*Val 10
这是一个很好的开始!
我肯定会把它全部弄平(即非规范化)并提出看起来像下面的产品文档.这样,您只需flags为每个产品创建一个数组,即可摆脱产品和标志之间的N:M关系.因此,查询这些标志会更容易.
{
"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"]
}
Run Code Online (Sandbox Code Playgroud)
产品映射类型如下所示:
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"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于您已经有logstash jdbc输入,所以您缺少的是用于获取产品和关联标志的正确SQL查询.
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
Run Code Online (Sandbox Code Playgroud)
哪个会得到这样的行:
+-------------------------------+-------+-------+---------------------+
| id | title | price | flags |
+-------------------------------+-------+-------+---------------------+
| 00c8234d71c4e94f725cd432ebc04 | Alpha | 589 | Sellout,Top product |
| 018357657529fef056cf396626812 | Beta | 355 | Discount |
| 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0 | Discount |
+-------------------------------+-------+-------+---------------------+
Run Code Online (Sandbox Code Playgroud)
使用Logstash过滤器,您可以将其拆分flags为数组,然后您就可以开始使用了.