通过具有多对多关联的Logstash将MySQL数据迁移到Elasticsearch

时间:2018-07-18 14:05:41

标签: mysql elasticsearch logstash

尝试使用Logstash创建从MySQL数据库到Elasticsearch索引的数据迁移。

我有这种数据库模式:

My db schema

item这是主表。我打算搜索item个。 每个item都有city。 它有许多colours。 它有许多specifications,每个都有在连接表中设置的value

目前,我仅通过cityitem合并到LEFT JOIN表中而成功进行了迁移。

我的迁移语句如下:

statement => "SELECT `item`.`id`, `item`.`title`, `item`.`description`, `city`.`name` AS `city` FROM `item` LEFT JOIN `city` ON `city`.`id` = `item`.`city`"

我的整个logstach.conf

input {
  jdbc { 
    jdbc_connection_string => "jdbc:mysql://localhost:3306/testdb?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"
    jdbc_user => "root"
    jdbc_password => ""
    jdbc_driver_library => "/some/local/path/mysql-connector-java-8.0.11.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    statement => "SELECT `item`.`id`, `item`.`title`, `item`.`description`, `city`.`name` AS `city` FROM `item` LEFT JOIN `city` ON `city`.`id` = `item`.`city`"
    }
  }
output {
  stdout { codec => json_lines }
  elasticsearch {
  "hosts" => "localhost:9200"
  "index" => "test-migrate"
  "document_type" => "data"
  "document_id" => "%{id}"
  }
}

想知道如何迁移colourspecification及其value来通过这些属性搜索我的item吗?

例如,如果有一个item,它与city ='London',与colour ='blue'和colour ='red ',并且colour ='黄色',并且与specification ='材料'和value ='陶瓷'相关联,则应使用“伦敦与蓝色和陶瓷”和“伦敦和红色和陶瓷”搜索查询。

1 个答案:

答案 0 :(得分:1)

您可以使用LEFT JOIN联接其余表并获取它们的值,如下所示-

SELECT item.id, 
    item.title, 
    item.description, 
    city.name AS city,
    spec.name as specificationName,
    ispec.value as specificationValue,
    color.name as color 
FROM item 
LEFT JOIN city ON city.id = item.city
LEFT JOIN Item_has_Color ic on ic.item = item.id
LEFT JOIN Item_has_Specification as ispec on ispec.item = item.id
LEFt JOIN color on color.id = ic.color 
LEFT JOIN specification as spec on spec.id = ispec.specification