【问题标题】:Elasticsearch with multiple parent/child relationship具有多个父/子关系的 Elasticsearch
【发布时间】:2017-04-14 14:35:15
【问题描述】:

Book、User 和 Review 说,我正在构建一个模型复杂的应用程序。

评论包含图书和用户 ID。 为了能够搜索至少包含一篇评论的图书,我已将图书设置为评论的父级,并具有这样的路由。但是,我还需要找到写过包含某些短语的评论的用户。

是否可以同时将 Book 和 User 作为 Review 的父级?有没有更好的方法来处理这种情况?

请注意,我无法更改数据建模的方式/不愿意这样做,因为数据是从持久性数据库传输到 Elasticsearch。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    据我所知,您不能有两个父母的文件。

    我的建议基于Application-side join chapter of Elasticsearch the definitive guide

    • 创建父/子关系Book/Review
    • 确保Review 映射中有user_id 属性,其中包含撰写该评论的用户ID。

    我认为这涵盖了您描述的两个用例:

    • Books that contain at least one review 有孩子可以解决filter/query
    • Users who wrote reviews that contain certain phrases 可以通过使用您要搜索的短语查询评论并在字段user_id 上执行cardinality aggregation 来解决。如果您需要用户信息,则必须使用检索到的 id 查询您的数据库(或其他弹性搜索索引)。

    编辑:"give me the books that have reviews this month written by user whose name started with John"

    我建议您收集所有这些高级用例,并对实现这些用例所需的数据进行非规范化处理。在这种特殊情况下,将用户名非规范化为Review 就足够了。无论如何,elasticsearch 的人都写过关于管理关系的文章 in their blogelasticsearch the definitive guide

    【讨论】:

    • 谢谢,但是数据比较大,所以应用程序端加入是我试图避免的。使用高级查询,例如:“给我本月由名字以 John 开头的用户撰写的有评论的书”?进行应用程序端连接会导致获取名称以 John 开头的所有用户并将这些 id 传递到术语过滤器中?
    • @tungd 我完成了我的回答并添加了一些您可能会感兴趣的参考资料
    • 我已经阅读了那些文章。如问题所述,我无法更改数据模型。我想应用程序端加入是唯一的方法。我还在研究“术语”过滤器的“查找”功能。还是谢谢。
    【解决方案2】:

    Somths like(只需将 Books 类型作为用户和评论类型的父级)

    .../index/users/_search?pretty" -d '
        {
            "query": {
                "filtered": {
                    "filter": {
                        "and": [
                            {
                                "has_parent": {
                                    "parent_type": "books",
                                    "filter": {
                                        "has_child": {
                                            "type": "Reviews",
                                            "query": {
                                                "term": {
                                                    "text_review": "some word"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
        '
    

    【讨论】:

      【解决方案3】:

      你有两个选择

      Elasticsearch 嵌套对象

      Elasticsearch 父级和子级

      两者都进行了很好的比较和评估here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        相关资源
        最近更新 更多