我有一个非常简单的问题。
我的弹性搜索索引包含1600000个相对较大的文档,我需要扫描索引以将其与经典的sql数据库同步。
我的文档包括sql ID和时间戳。
然后为了同步sql db和弹性索引,我只是顺序读取行和文档,都按id排序,并比较id我可以确定是否需要删除文档(比较是否定的),添加一个新的带有sql行的文档(比较为正),如果比较为0,我会比较时间戳,以了解我是否需要更新文档。
它有效,但我观察到,随着我的阅读提前阅读文档的速度会慢得多。
我通过重复搜索索引来检索我的文档,每次都移动请求的“from”字段,如下所示:
{
"from" : 0, "size" : 10000,
"fields" : ["idannonce","ts"],
"sort" : ["idannonce"],
"query" : "match_all" {}
}
当“from”是1000000而不是0时,这个简单的查询要慢得多。
这是正常行为吗?我认为应该大概在“idannonce”字段应该被编入索引的同时,不是吗?
有什么想法? 有没有办法编写相同的查询,以便它在一个恒定的时间内运行?
由于
答案 0 :(得分:1)
Search API不是针对此用例设计的。除了获得次优性能之外,您可能还缺少一些更改,因为删除和添加会在更改提交到索引时“移动”检索窗口时干扰弹性搜索结果。您应该切换到Scroll API,这更适合此操作。
答案 1 :(得分:1)
我也做了类似的事情,但我发现https://github.com/jprante/elasticsearch-river-jdbc更有用。这是非常简单的集成。请尝试使用此功能。 请发布您的代码要点。此外,https://github.com/lukas-vlcek/bigdesk会在您运行查询时观察图表。