【问题标题】:Integrate Elasticsearch with PostgreSQL while using Sails.js with Waterline ORM在使用 Sails.js 和 Waterline ORM 时将 Elasticsearch 与 PostgreSQL 集成
【发布时间】:2016-10-02 16:12:09
【问题描述】:

我正在尝试将 Elasticsearch 与 Sails.js 集成,但我的数据库不是 MongoDB:我使用 PostgreSQL,所以这个 post 没有帮助。

我已经在我的 Ubuntu 机器上安装了 Elasticsearch,现在它运行成功了。我还在 Sails 项目中安装了这个 package,但我无法在现有模型上创建索引。

如何在模型上定义索引,以及如何在模型中使用 Elasticsearch 进行搜索?

我需要在模型中定义哪些钩子?

【问题讨论】:

  • 我编辑了问题,希望你不会介意。我在标题中添加了 postgresql 以避免混淆。
  • @ManjeetThakur 那篇文章提到现在不推荐使用河流。并且已弃用。 OP也想要postgresql的解决方案。
  • @Ahmed 你还想要什么答案?我已经一步一步地给出了如何解决这个问题的线索。如果您查看,宽限期即将到期。

标签: node.js postgresql elasticsearch sails.js


【解决方案1】:

Here 你可以找到一个非常简单的包(sails-elastic)。它通过直接来自 elasticsearch 本身的配置进行操作。

Elasticsearch docsindex creation in particular

【讨论】:

    【解决方案2】:

    有很多方法可以解决这个问题。推荐的方法是通过我已经详细给出的elasticsearch使用logstash。 我会在这里列出我知道的大部分方法:

    1. 使用 Logstash

      curl https://download.elastic.co/logstash/logstash/logstash-2.3.2.tar.gz > logstash.tar.gz
      tar -xzf logstash.tar.gz
      cd logstash-2.3.2
      

      安装jdbc输入插件:

      bin/logstash-plugin install logstash-input-jdbc
      

      然后下载postgresql jdbc驱动。

      curl https://jdbc.postgresql.org/download/postgresql-9.4.1208.jre7.jar > postgresql-9.4.1208.jre7.jar
      

      现在为 logstash 创建一个配置文件,以使用 jdbc 输入作为 input.conf:

      input {
        jdbc {
          jdbc_driver_library => "/Users/khurrambaig/Downloads/logstash-2.3.2/postgresql-9.4.1208.jre7.jar"
          jdbc_driver_class => "org.postgresql.Driver"
          jdbc_connection_string => "jdbc:postgresql://localhost:5432/khurrambaig"
          jdbc_user => "khurrambaig"
          jdbc_password => ""
          schedule => "* * * * *"
          statement => 'SELECT * FROM customer WHERE "updatedAt" > :sql_last_value'
          type => "customer"
        }
        jdbc {
          jdbc_driver_library => "/Users/khurrambaig/Downloads/logstash-2.3.2/postgresql-9.4.1208.jre7.jar"
          jdbc_driver_class => "org.postgresql.Driver"
          jdbc_connection_string => "jdbc:postgresql://localhost:5432/khurrambaig"
          jdbc_user => "khurrambaig"
          jdbc_password => ""
          schedule => "* * * * *"
          statement => 'SELECT * FROM employee WHERE "updatedAt" > :sql_last_value'
          type => "employee"
        }
      
        # add more jdbc inputs to suit your needs
      }
      output {
          elasticsearch {
              index => "khurrambaig"
              document_type => "%{type}"   # <- use the type from each input
              document_id => "%{id}" # <- To avoid duplicates
              hosts => "localhost:9200"
          }
      }
      

      现在使用上面的文件运行logstash:

      bin/logstash -f input.conf
      

      对于您要作为文档(表)类型插入索引(数据库,此处为 khurrambaig)中的每个模型,使用适当的 SQL 语句(此处为 SELECT * FROM employee WHERE "updatedAt" > :sql_last_value)。在这里,我使用 sql_last_value 仅放置更新的数据。您还可以在 logstash 中进行调度和许多事情。在这里,我每分钟都在使用。有关详细信息,请参阅this

      查看已插入特定类型索引的文档:

      curl -XGET 'http://localhost:9200/khrm/user/_search?pretty=true'    
      

      这将列出我的案例的客户模型下的所有文档。查看弹性搜索 api。用那个。或者使用nodejs官方client

    2. 使用 jdbc 输入

      https://github.com/jprante/elasticsearch-jdbc

      您可以阅读它的自述文件。这很简单。但这并没有提供调度和许多由 logstash 提供的东西。

    3. 使用sails-elastic

      您需要使用自述文件中给出的多个适配器。

      但不建议这样做,因为它会减慢您的请求速度。对于每次创建、更新和删除,您将调用两个数据库:elastic search 和 postgresql。

      在 logstash 中,文档的索引与请求无关。这种方法被包括维基百科在内的许多人使用。此外,您仍然独立于框架。今天你使用sails,明天你可能会使用其他东西,但如果你仍然使用postgresql,你不需要更改logstash的任何东西。 (如果你改变了db,即使这样,很多db的输入都是可用的,如果从任何sql rdbms更改为另一个,你只需要更改为jdbc驱动程序)

    还有zombodb,但它目前仅适用于pre 2.0 elastic(也支持> ES 2.0)。

    【讨论】:

    • ZomboDB 作者在这里。 ZDB 还不支持 ES 2.x,但很快就会支持。我可能有点偏见,但它确实是将 ES 和 PG 正确联系在一起的唯一方法,以便您的 ES 查询 a) 事务正确,b) 自动同步,c) 不需要应用程序代码来处理 ES .
    • @EricB.Ridge 好的。感谢您的信息。会更新。
    • ZomboDB 现在支持 ES 2.4 和 ES 5.6 支持已接近完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多