我有一个使用 jdbc river 插件的弹性搜索河设置,它只是执行一个简单的 select * from 并索引该表。
但我希望能够通过 API 以及标准时间间隔按需触发河流,以便在将文档插入此表时将其索引。
有谁知道目前是否有这样做的?
IE
/_river/my_river/_refresh
谢谢。
我有一个使用 jdbc river 插件的弹性搜索河设置,它只是执行一个简单的 select * from 并索引该表。
但我希望能够通过 API 以及标准时间间隔按需触发河流,以便在将文档插入此表时将其索引。
有谁知道目前是否有这样做的?
IE
/_river/my_river/_refresh
谢谢。
我看不到触发 JDBC River 实时索引特定更新文档的好方法,而且我不确定它是否打算用于此目的。
您为什么不直接从更新代码中索引文档,而不是触发 JDBC 河来索引您的文档?
JDBC 河是一种输入大量数据流的好方法,并且有用于保持与轮询的一致性的文档。但我认为满足您的实时要求并不容易。
听起来您正在努力解决经典的“推与拉”索引问题。Rivers 旨在每隔一段时间从数据库中提取数据。它们很容易设置,但就像计算机科学中的所有事物一样,它们是一种权衡。具体来说,您失去了实时索引。您可以触发的一条河流可能是两全其美的,或者它可能会用大量不必要的流量淹没您的服务器(即,当您确切知道哪个文档已更新时,为什么还要执行“SELECT * ...”?)。
如果您有实时索引要求(就像我一样),您可以将更新“推送”到 Elasticsearch。您只需要编写一个 Elasticsearch 客户端,它将在保存更新的记录时将其传送到 Elasticsearch。FWIW,我通过在服务总线上触发消息解决了这个问题,而在另一端等待的服务从 SQL 检索实体并对其进行索引。一旦你有了这个基础设施,编写一个小应用程序来进行 SQL 数据的初始导入或创建一个计划的作业来索引数据就不是什么大问题了。
谢谢你的建议。非常欢迎您提供反馈,请加入 elasticsearch 社区。我将在https://github.com/jprante/elasticsearch-river-jdbc/issues打开一个触发提取的问题
或者将logstash与jdbc插件一起使用
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html
示例配置:
input {
jdbc {
jdbc_connection_string => "jdbc:oracle:thin:@localhost:1521:XE"
jdbc_user => "user"
jdbc_driver_library => "/home/logstash/lib/ojdbc6.jar"
jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
statement => "select * from events where update_date > :sql_last_value order by update_date"
last_run_metadata_path => "run_metadata_event.log"
schedule => "* * * * *"
jdbc_password => "password"
}
}
# The filter part of this file is commented out to indicate that it is
# optional.
filter {
mutate {
split => { "field_1" => ";"}
}
}
output {
elasticsearch {
#protocol => "http"
hosts => ["localhost:9200"]
index => "items"
document_type => "doc_type"
document_id => "%{doc_id}"
}
}