【问题标题】:Updating multiple documents on nested object change在嵌套对象更改时更新多个文档
【发布时间】:2015-10-31 23:29:54
【问题描述】:

我正在为我的 Ruby on Rails 应用程序使用 elasticsearch-railselasticsearch-model gems,这就像一个问答网站。

我的主要问题是:当嵌套在多个文档中的嵌套对象发生更改时,如何告诉 Elasticsearch 更新哪些文档?

我有一个索引my_indexquestionanswer 的映射。特别是,question 有一个带有user 的嵌套对象:

"question": {
   "properties": {
      "user": {
         "type": "nested",
         "properties": {
            "created_at": {
               "type": "date",
               "format": "dateOptionalTime"
            },
            "name": {
               "type": "string"
            },
            "id": {
               "type": "long"
            },
            "email": {
               "type": "string"
            }
          }
      }
      ...
   }
}

用户可以更改他的名字,我有钩子来更新 Elasticsearch 中的用户:

after_commit lambda { __elasticsearch__.index_document},  on: :update

但这并没有正确更新适当的question 对象,我不知道将什么传递给index_document 调用以确保它使用新用户名更新所有相应的questions。有人知道吗?它甚至可以帮助我了解 RESTful/curl 请求应该是什么样子?

任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 elasticsearch


    【解决方案1】:

    有几种不同的方法可以解决这个问题。不过,它们都可能需要一些代码更改。我认为没有办法直接按照您当前的设置完成您的要求。

    您可以阅读here 的各种选项。如果您可以将事情设置为一对多关系,那么parent/child relationship 可能是要走的路。然后你可以这样设置:

    PUT my_index
    {
       "mappings": {
          "user": {
             "properties": {...}
          },
          "question": {
             "_parent": {
                "type": "user"
             },
             "properties": {...}
          }
       }
    }
    

    在这种情况下,您将能够独立于questions 更新users。但它使查询变得更加复杂,这可能是您的应用程序代码中的问题,也可能不是。

    鉴于您已经设置了嵌套文档,您可以简单地查询以该特定用户为嵌套文档的所有文档,例如:

    POST /test_index/question/_search
    {
       "filter": {
          "nested": {
             "path": "user",
             "filter": {
                "term": {
                   "user.id": 2
                }
             }
          }
       }
    }
    

    一旦您拥有所有受影响的question 文档,您就可以修改每个文档中的用户名,并使用bulk index 请求更新所有文档。

    这是我用来玩最后一点的一些代码:

    http://sense.qbox.io/gist/d2a319c6b4e7da0d5ff910b4118549228d90cba0

    【讨论】:

    • 嘿,斯隆,这确实使查询变得更加困难。特别是,我正在尝试设置祖父母和孙子女(如elastic.co/guide/en/elasticsearch/guide/current/…),但似乎inner_hits 停止工作......您对为什么会发生这种情况有任何想法吗?
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多