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