我使用jdbc河流插件进行弹性搜索河流设置,只需执行简单的select * from和索引该表。
但我希望能够通过API以及标准时间间隔按需触发河流,这样我就可以在文档插入此表时将其编入索引。
目前有人知道无论如何都要这么做吗?
即。
/_river/my_river/_refresh
感谢。
答案 0 :(得分:1)
我没有看到一个很好的方法让您触发JDBC River实时索引您的特定更新文档,而且我不确定它是否适合用于此目的。
为什么不直接从更新代码索引文档,而不是触发JDBC河来索引文档?
JDBC河是提供大量数据流的好方法,而且documentation for maintaining coherency with the polling。但我不认为有一个容易满足你的实时要求。
答案 1 :(得分:0)
感谢您的建议。非常欢迎您提供反馈,请加入elasticsearch社区。我将打开一个触发https://github.com/jprante/elasticsearch-river-jdbc/issues
获取的问题答案 2 :(得分:0)
听起来你正在努力解决经典的“push vs. pull”索引问题。 Rivers旨在以一定间隔从数据库中提取数据。它们很容易设置,但就像计算机科学中的所有东西一样,它们是一种权衡。具体来说,您将失去实时索引。你可以触发的河流可能是两个世界中最好的河流,或者它可能会因为大量不必要的流量而淹没你的服务器(例如,当你确切地知道哪个文件被更新时,为什么要“SELECT * ...”。)。
如果您有实时索引要求(就像我一样),您可以将更新“推送”到Elasticsearch中。您只需要编写一个Elasticsearch客户端,它将在保存时将更新的记录传递给Elasticsearch。 FWIW,我通过在服务总线上触发消息解决了这个问题,另一端等待的服务从SQL中检索实体并将其编入索引。一旦拥有了这个基础架构,编写一个小应用程序来初始导入SQL数据或创建一个预定作业来索引数据并不是什么大问题。
答案 3 :(得分:-1)
alernative将使用带有jdbc插件的logstash
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}"
}
}