具有多个父/子关系的Elasticsearch

时间:2015-04-27 15:11:10

标签: elasticsearch

我正在构建一个包含复杂模型的应用程序,Book,User and Review。

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

  • 创建父/子关系Book / Review
  • 请确保user_id映射中包含Review属性,其中包含撰写该评论的用户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

的文章

答案 1 :(得分:0)

您有两个选择

  

Elasticsearch嵌套对象

     

Elasticsearch parent& child

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

答案 2 :(得分:0)

Somths喜欢(只需将图书类型设置为用户和评论类型的父级)

.../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"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
    '