0

我正在处理从 MySQL 到 elasticsearch 的复制数据,所以我正在使用 logstash 进行复制,但问题是在 mysql 中有一个产品表有很多关系,并且选择查询包含 46 个左外连接,所以返回的结果非常大它仅针对表产品的单个记录返回大约 50000 (50k) 行,这使得复制性能很慢,所以我需要询问是否有其他解决方案可以进行复制以及如何解决性能问题并产生巨大的结果

产品样本及其关系(不是全部):

产品及其关系

这就是弹性搜索映射:

弹性搜索映射

4

1 回答 1

1

您需要利用 mysql 中的json 数据类型。这里的范例是在实际索引过程之前处理所有这些漂亮的数据。您运行一个存储过程来处理数据并将其存储在一个大的平面表中。您的所有关系都存储为 json 字段中的 json 对象(当然,当它有意义时)。然后将这些关系索引为elasticsearch 中的嵌套数据类型。然后,您可以对其进行聚合以获得所需的结果。奇迹般有效!

例如:

INSERT prod.id,
...,
(SELECT JSON_ARRAYAGG(JSON_OBJECT('color', color, 'size', size)) FROM tag_products where prod.id = tprod.product_id) AS tag_product_as_json,
INTO Elastic_Products FROM Products AS prod
LEFT JOIN tag_product AS tprod ON prod.id = tprod.product_id
...

我更像是一个 SQL 服务器的人,所以如果您发现语法中的任何错误,请原谅我。tag_product_as_json 将是 json 数据类型,并且将包含具有相同 product_id 的所有行。你可以在那里存储很多行。这个例子非常基础。您可以使用公用表表达式以更节省内存的方式获得类似的结果,但它更复杂并且超出了本主题的范围。

于 2019-06-16T14:20:24.717 回答