簡體   English   中英

mysql 關系數據庫同步到彈性搜索的最佳實踐

[英]Best practice for mysql relational database syncing to elastic search

我有一個用戶字段,它依賴於許多其他字段,它具有其他表的多個外鍵,並且使用 pivot 表和一對多關系具有多對多關系。

API 類似於嵌套的 JSON 結構。 對於特定用戶,關系數據看起來像這樣。

user = {
  id : _212dasd,
  name: "alphabeta",
  key1_id = 23,
  key1 : {
     id: 23,
     name: "new name"
  },
  key2 : [
      {
         id: _asdak61526,
         key2_id : 2
         user_id : _212dasd,

      },
      {
         id: _asdak6152a,
         key2_id : 3
         user_id : _212dasd
      }
  ],
  key3: {
     name : "gama",
     key_3_nested : {
       name : "abc",
       key_3_nested_levle2 : {
            name : "xyz",
       }
     }
   }
 }

我怎樣才能將 mysql 關系數據同步到彈性搜索,因為大多數讀取將 go 與彈性搜索,我使用 log-stash 進行同步。

input {
  jdbc { 
    jdbc_connection_string => "jdbc:mysql://localhost:3306/database_name"
    # The user we wish to execute our statement as
    jdbc_user => "root"
    jdbc_password => "root"
    # The path to our downloaded jdbc driver
    jdbc_driver_library => "/~/mysql-connector-java-5.1.17.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    # our query
    statement => "SELECT * FROM users INNER JOIN table2 ON table2.user_id = users.id" // just a demo query
    schedule => "* * * * * *"
    }
  }
output {
  elasticsearch {
    document_id=> "%{sk_id}.%{user_id}"
    document_type => "doc"
    index => "db_prd"
    hosts => ["http://localhost:9200"]
  }
  stdout{
    codec => json_lines 
  }
}

問題:如何維護關系,創建多重連接查詢是一個好主意,因為每次它都會對大量用戶數據進行多重大連接,並且結構沒有優化。 對於 10000 個用戶並加入多個表會減慢同步速度。 它會同步每個索引還是只更改一個?

如何從彈性搜索中獲取 API 上的嵌套結構。

您可以在過濾器中使用 jdbcstream 來添加嵌套的 object,例如:

jdbc_streaming {
            jdbc_driver_library => "/~/mysql-connector-java-5.1.17.jar"
            jdbc_driver_class => "org.mariadb.jdbc.Driver"
            jdbc_connection_string =>  "jdbc:mysql://localhost:3306/database_name"
            jdbc_user => "root"
            jdbc_password => "12345678@Abc"
            statement => "SELECT * FROM table2 ON table2.user_id = cus_id"
            parameters => {"cus_id" => "id"}
            target => "table2"
          }

它將創建嵌套的“table2”,其中數據是從語句 => "SELECT * FROM table2 ON table2.user_id = cus_id" with "id" => "SELECT * FROM users;"響應的行 (此語句的修復=> "SELECT * FROM users INNER JOIN table2 ON table2.user_id = users.id"

注意:它會減慢你的進程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM