Elasticsearch关键字搜索从具有20多个关联关系的RDBMS表迁移
你好。我想将RDBMS数据迁移到Elasticsearch并使用搜索引擎功能。
我不确定我的实现细节是否正确,我担心我可能从一开始就做错了什么,所以我决定发布一个问题。
如果您能在阅读内容后给予我一些建议或意见,我将非常感激。
要搜索的RDBMS表的范围(数量)约为20,包括Map表(1:N关系设置)
我想在搜索框UX中输入搜索词,并对上表中存在的所有字段执行搜索。
有没有办法维护RDBMS的关联关系,将数据迁移到Elasticsearch,并在使用关键字搜索时输出上表中存储的所有相关信息?
(目前,我使用Logstash为每个表创建一个索引,添加一个可以在每个索引中搜索的公共字段,并获取连接表引用的原始表的键。
我正在用这个键向RDBMS发送另一个请求并获取数据,所以我认为我没有正确使用ES的特性。)
感谢您阅读这篇长长的文章。
1条答案
按热度按时间2skhul331#
嘿欢迎来到这个社区
好吧,对你的问题的简短回答是否定的;你不能将关系数据库的逻辑复制到像elasticsearch这样的非关系分布式系统中,这就是为什么!
你的问题的答案是denormalizing你的数据,elasticsearch wrote about it之前在一个过时的版本,但仍然有帮助,你可以阅读有关它的详细信息,以了解更多。
您仍然可以使用field join types实现相同的关系逻辑,但由于性能问题,不建议使用它,请阅读本文和本文。
如何反规范化数据
在直接跳到logstash并开始索引数据之前,您需要首先了解每个表之间的完整关系。例如,考虑用户和博客文章的一对多关系,每个用户可以写许多博客文章。一个简单的SQL数据库应该是:
在elasticsearch中,你只需要存储一个表(或者数据的冗余副本,这将提高搜索性能),而不是存储两个表(又名索引)。换句话说,您将索引执行连接的SQL查询的结果。在这种情况下,SQL查询的结果将类似于:
在elasticsearch中,你将创建一个索引,例如
users_blogpost
,索引的文档将是SQL结果的行:你可以写一个脚本(这里有一个ES clients的列表,选择你喜欢的语言),它对你的sql表进行批处理或分块,并将sql结果索引到Elasticsearch。但是在执行任何索引之前,您需要编写mapping并为每个字段定义适当的类型。
希望能帮上忙
马尔万