从 SQL Server 到 ElasticSearch Node 的数据传输



我在我的应用程序中使用了 Elastic Search 1.7 版本,通过使用河流的概念,我使用以下文章将数据从 SQL Server 填充到 ElasticSearch https://www.pluralsight.com/blog/it-ops/elasticsearch-and-sql-server:

URL: POST http://localhost:9200/_river/my_jdbc_river/_meta
JSON:
{
"type":"jdbc",
"schedule" : "0 0-59 0-23 ? * *",
"jdbc": {
"driver":"com.microsoft.sqlserver.jdbc.SQLServerDriver",
"url":"jdbc:sqlserver://127.0.0.1:1433;databaseName=MyDatabase",
"user":"my_db_user","password":"password",
"sql":"select ID as _id, FirstName, LastName, DateOfBirth from People",
"index":"people",
"type":"person"
}
}

但是在弹性搜索 2.0 的文档中,它说河流已被弃用。有没有更好的方法可以使用弹性搜索 2.0 将数据从 SQL Server 复制到弹性

任何替代代码示例都将非常有帮助

谢谢

你应该看看这个: https://github.com/jprante/elasticsearch-jdbc/wiki/jdbc-plugin-feeder-mode-as-an-alternative-to-the-deprecated-elasticsearch-river-api

编辑:这就是我逐步所做的,将数据从SQL Server同步到ElasticSearch,没有弃用的river。我从头开始。如果您已经设置了河流,则可能已经完成了其中一些步骤。

  • 下载适用于您的 elasticsearch 版本的 JDBC 导入器:https://github.com/jprante/elasticsearch-jdbc#compatiblity-matrix
  • 将其解压缩到弹性搜索文件夹中。请注意,您可以在任何地方解压缩它,但不要将其放在 {elasticsearch}/plugin 中,或者因为它不是插件,它会导致 elasticsearch 在启动时崩溃。
  • 从Microsoft下载JDBC驱动程序:https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774(我下载了".exe"版本)
  • 执行它。它会创建一个解压缩的文件夹。打开它并将 sqljdbc4.jar、sqljdbc41.jar 和 sqljdbc42.jar 复制到 {elasticsearch-jdbc}/lib(注意不要复制 sqljdbc.jar)
  • 启用与 SQL Server 的 TCP/IP 连接(请参阅示例 http://r2d2.cc/2015/08/05/the-tcpip-connection-to-the-host-localhost-port-1433-has-failed-microsoft-sql-server-2014/)
  • 在 Elasticsearch 目录中创建目录 {elasticsearch}\bin\feeder
  • 使用以下内容创建jdbc_sqlserver.json 文件:
    {  "type":"jdbc",
      "jdbc":{ 
         "url":"jdbc:sqlserver://localhost:1433;databaseName=test", 
         "user":"test",
         "password":"test",
         "sql":"SELECT id as _id, id, name,email FROM test",
         "index":"users",
         "type":"user", 
         "autocommit":"true"
         } 
     }
  • 使用以下内容创建 jdb_sqlserver.ps1 文件:
function Get-PSVersion {
     if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
$powershell = Get-PSVersion
if($powershell.Major -le 2 ){
 Write-Error "Oh, so sorry, this script requires Powershell 3 (due to convertto-json)"
 exit
}
if((Test-Path env:JAVA_HOME) -eq $false){
 Write-Error "Environment variable JAVA_HOME must be set to your java home"
 exit
}
curl -XDELETE "http://localhost:9200/planets"
$DIR = "D:programselasticsearchpluginselasticsearch-jdbc-1.7.0.1"
$FEEDER_CLASSPATH="$DIRlib"
$FEEDER_LOGGER="file://$DIRbinlog4j2.xml"
java -cp "$FEEDER_CLASSPATH*" -"Dlog4j.configurationFile=$FEEDER_LOGGER" "org.xbib.tools.Runner" "org.xbib.tools.JDBCImporter" jdbc_sqlserver.json
  • 使用 powershell 执行 jdb_sqlserver.ps1

这篇文章非常有帮助:http://r2d2.cc/2015/08/05/elastic-search-on-windows-with-mysql-sql-server-2014-and-import-feeder/

我们的计划是,当我们把记录写入SQL时;然后我们获取主键并将其放入队列系统(在我们的例子中是RabbitMQ)。 然后,该队列上有一个使用者(或许多使用者)将数据从 SQL 中提取出来并将其插入 ES。

拥有中间队列为我们带来了许多优势:

  1. 我们可以花更多的时间来收集我们想要插入到 ES 中的所有数据,而无需我们的客户等待
  2. 如果我们想用更多/不同的数据重新索引 ES,我们可以将该主键放回队列中,它将再次收集数据。
  3. 如果 ES 因
  4. 维护而停机,数据仍将存在于队列中,并在 ES 重新联机时重新拾取。

如果你现在引用这篇文章(像我一样),ElasticSearch 已经继续前进,并且与用于不支持 ES 5.x.x 的 spring 启动客户端存在兼容性问题。因此,您必须创建自己的兼容/等待 ES 提供支持/使用替代解决方案将 SQL Server 桥接到 ES 的 Spring 启动客户端。

请参阅:https://github.com/spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix

最新更新