如何在预先存在的 SQL 数据库之上使用 Elastic Search?

Posted

技术标签:

【中文标题】如何在预先存在的 SQL 数据库之上使用 Elastic Search?【英文标题】:How to use Elastic Search on top of a pre-existing SQL Database? 【发布时间】:2013-07-25 06:05:39 【问题描述】:

我已经阅读了很多关于如何使用 javascriptphp 在网站上实现 Elastic Search 的优秀文档。

非常好introduction to ES。

非常完整的文档here 和here。

整个CRUD。

使用 PHP 进行弹性搜索:here、here 和 here。

因此,我给您提供这些 URL 的原因是为了了解在拥有预先存在的 SQL DB 时如何使用这些优秀文档中的一个或多个。

我在某处遗漏了要点:正如他们所说,Elasticsearch 将使用 MongoDB 创建自己的索引和数据库,我不明白如何使用 SQL 使用我的(巨大的)数据库?假设我有一个 mysql 数据库,我想使用 Elasticsearch 来加快我的研究速度并提出用户预先制作的查询,我该怎么做? ES 如何在 MySQL 之上/沿着 MySQL 工作?如何将这组庞大的数据(超过 8GB)传输到 ES DB 中,以便在开始时充分高效?

非常感谢

【问题讨论】:

将 elasticsearch 想象成另一个数据库,它是一个基于文档的 NoSQL 数据库(如 MongoDB),针对搜索进行了优化。您必须将所有数据索引到 elasticsearch 才能使用它。 所以你的意思是我必须将我在实际数据库中的所有信息都转移到 ES'NoSQL 数据库中?那么每次我在我的 SQL DB 中添加一些东西时,我都必须复制到 ES 的 DB 中? 有一些技术可以使它们保持同步。查找河流。您只需要导入您可能实际用于搜索的信息,因此可能不是每个字段。想想它如何能够在不以某种方式重新排列数据的情况下比 SQL 更快地进行搜索?如果不需要这样做,那么 mySQL 数据库人员肯定会实现一些东西! 谢谢,非常有帮助。 大多数人使用 elasticsearch 的方式是使用库、用于 php 的 elastica、用于 ruby​​ 的轮胎等...这些通常有一些方法可以轻松维护基于其他数据存储的 elasticsearch 索引.有些人使用 elasticsearch 作为他们的主要数据存储,我会留给你阅读,但我得到的印象是它还不够成熟,无法做到这一点。 【参考方案1】:

我正在使用带有 mysql 的 jdbc-river。它非常快。您可以将它们配置为持续轮询数据,或使用一次性(一次性策略)导入。

例如

curl -xPUT http://es-server:9200/_river/my_river/_meta -d '

    "type" : "jdbc",
    "jdbc" : 
        "strategy" : "simple",
        "poll" : "5s",
        "scale" : 0,
        "autocommit" : false,
        "fetchsize" : 10,
        "max_rows" : 0,
        "max_retries" : 3,
        "max_retries_wait" : "10s",
        "driver" : "com.mysql.jdbc.Driver",
        "url" : "jdbc:mysql://mysql-server:3306/mydb",
        "user" : "root",
        "password" : "password*",
        "sql" : "select c.id, c.brandCode, c.companyCode from category c"
    ,
    "index" : 
        "index" : "mainIndex",
        "type" : "category",
        "bulk_size" : 30,
        "max_bulk_requests" : 100,
        "index_settings" : null,
        "type_mapping" : null,
        "versioning" : false,
        "acknowledge" : false
    
'

【讨论】:

【参考方案2】:

如果您需要针对 jdbc-river 提供的轮询提供更高性能和可扩展性的解决方案,我建议您观看此演示文稿,该演示文稿解释了如何执行从 SQL Server 到 Elastic Search 的增量同步:

视频中讨论的原则也适用于其他 RDBMS -> NoSQL 复制应用程序。

Adding Elasticsearch To An Existing .NET / SQL Server Application(YouTube)

【讨论】:

以上是关于如何在预先存在的 SQL 数据库之上使用 Elastic Search?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQLAlchemy ORM 会话中查询预先存在的表?

如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1

如何使用 rpmbuild 更新预先存在的配置文件?

如何使用预先存在的动画为视图设置动画?

如何将预先存在的 sqlite 文件放入 <Application_Home>/Library/?

SQL FK 和预检查是不是存在