【问题标题】:What is the best way to index Couchbase data on Elastic Search在 Elastic Search 上索引 Couchbase 数据的最佳方法是什么
【发布时间】:2014-03-17 21:52:17
【问题描述】:

我使用 Couchbase DB,我想在 Elastic Search (ES) 上索引其部分数据。 来自 Couchbase 的数据应该是同步的,即如果 CB 上的文档发生更改,它应该更改 ES 上的文档。 我有几个关于什么是最好的方法的问题:

  • 同步数据的最佳方式是什么?我看到ES有一个CB插件(http://www.couchbase.com/couchbase-server/connectors/elasticsearch),但这是推荐的方式吗?
  • 我不想将所有 CB 文档存储在 ES 上,而只存储其中的一部分,例如我想存储一些字段,而一些不想存储 - 我该怎么做?
  • 我的文档可能有不同的属性并且差异可能很大(例如 50 个不同的属性/字段)。假设我想将所有这些属性都索引到 ES,是否会因为索引了很多字段而影响性能?

10 倍,

【问题讨论】:

    标签: elasticsearch couchbase


    【解决方案1】:

    鉴于文档链接,我假设您使用的是 Couchbase 而不是 CouchDB。

    1. 您正在访问正确的链接,以便将 Elastic Search 与 Couchbase 结合使用。根据文档,配置 Couchbase 的跨数据中心复制 (XDCR) 功能,以便在发生突变时自动将数据推送到 ES。

    2. 如果没有定义映射文件,ES 将创建一个默认映射。您可以提供自己的映射文件(或更改它生成的文件)来控制哪些字段被索引。请参阅http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-object-type.html 的 ES 文档中的 enabled 属性。

    3. 是的,索引所有字段会影响性能。您可以在 http://docs.couchbase.com/couchbase-elastic-search/#managing-performance 找到一些 Couchbase 集成的绩效管理技巧。集成的首选方法是在 ES 中执行搜索,并且只获取匹配文档的密钥。然后,您对 Couchbase 集群进行 multiget 调用以自行检索文档详细信息。因此,虽然 ES 将索引许多字段,但您不会将所有字段存储在那里,也不会从 ES 中检索它们的值。针对 Couchbase 的内存中 multiget 是使用 ES 中的 ID 检索匹配文档的最快方法。

    【讨论】:

    • 是的,我使用的是 Couchbase 而不是 CouchDB :)
    • 我打算像你说的那样工作,只存储ID和必要的字段以在ES上建立索引,然后使用multi get。但是,我不明白的是如何使用 XDCR 并同时对文档进行操作。我的意思是,我想在将文档存储到 ES 之前对文档进行一些更改(例如删除一些不必要的字段)
    • 嗨,谢伊。设置 XDCR 配置后,源集群 (Couchbase) 中的所有文档变更都将流向目标集群 (ES)。整个文档流向 ES,在那里它被索引。索引利用您定义的映射来指定应索引哪些字段,它们的字段类型是什么等。您的模板可以选择忽略文档中不必要的字段。所有的索引都是 ES 的函数。 Couchbase 只是将文档发送到 ES 集群。
    【解决方案2】:

    很多问题..!

    让我一一回答:

    1) 使用 River 插件动态同步数据的最佳方式和现有解决方案。它还会单独索引更改的文档。它对性能有很大帮助。

    2)是的,您可以限制在河插件中索引的字段。参考

    插件的文档可以在couchbase网站上找到。 参考:http://docs.couchbase.com/couchbase-elastic-search/

    Github River 仍在开发中。,但您可以使用代码并根据需要进行修改。

    https://github.com/mschoch/elasticsearch-river-couchbase

    3)如果您索引所有字段,是的,性能会有一些滞后。因此最好单独索引所需的字段。如果你需要存储一些字段只是为了存储,那么在映射中提到不具体分析。这将减少索引时间和搜索时间。

    希望它有帮助..!

    【讨论】:

    • couchbase 有一个 River 插件。但它仍处于开发阶段。但是您可以下载代码并根据需要进行更改。参考github.com/mschoch/elasticsearch-river-couchbase
    • 抱歉误会..我已经更新了我的答案。请检查一下..!
    【解决方案3】:

    您可能会发现有关 Don Stacy 对问题 2 的回答的附加解释很有用:

    当从 Couchbase 复制时,有 3 种方式可以干扰 Elasticsearch 的默认映射(在启动 XDCR 之前),因此,根据需要,通过设置 "store" = false 不存储某些字段:

    1. 在索引上创建手动映射
    2. 创建动态模板
    3. 编辑 couchbase_template.json

    提示:

    1. 请注意,当我们从 Couchbase 到 Elasticsearch 执行 XDCR 时,Couchbase 将原始文档包装在“doc”字段中。这意味着您必须在创建映射时考虑此修改后的结构。它看起来像这样:

      curl -XPUT 'http://localhost:9200/test/couchbaseDocument/_mapping' -d '
      {
        "couchbaseDocument": {
          "_source": {
            "enabled": false
          },
          "properties": {
            "doc": {
              "properties": {
                "your_field_name": {
                  "store": true,
                  ...
                },
                ...
              }
            }
          }
        }
      }'
      

      文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html

      包含/排除来自 _source 的字段:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-source-field.html

    2. 文档:https://www.elastic.co/guide/en/elasticsearch/reference/2.0/dynamic-templates.html

    3. https://forums.couchbase.com/t/about-elasticsearch-plugin/2433 https://forums.couchbase.com/t/custom-maps-for-jsontypes-with-elasticsearch-plugin/395

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2011-03-20
      • 1970-01-01
      相关资源
      最近更新 更多