弹性搜索中的一对多关系

时间:2012-11-17 03:39:48

标签: elasticsearch

假设我有两个名为“twitter_user”和“twitter_comments”的表。

twitter_users 包含字段:username和bio twitter_comments 包含字段:用户名和评论

显然,用户在twitter_users中有1个条目,在twitter_comments中有很多条目

我想在弹性搜索中对twitter_users和twitter_comments进行建模,在我查询时让ES搜索这两个模型,知道评论会计入Twitter用户的整体相关性分数。

我知道我可以通过创建一个额外的字段(除了username和bio)以及所有连接的注释来模仿这个模型。但是还有另一种“更清洁”的方式吗?

2 个答案:

答案 0 :(得分:8)

取决于。

如果您只想搜索用户评论,全文和所有字段,只需将所有评论存储在用户对象中(无需连接任何内容):

{
    "user" : {
        "username" : "TestUser",
        "bio" : "whatever",

        "comments" : [
        {
            "title" : "First comment",
            "text" : "My 1st comment"
        },
        {
            "title" : "Second comment",
            "text" : "My 2nd comment"
        }
        ]
    }
}

如果您需要基于评论的每个查询,则需要将评论映射为nested(在提交任何数据之前),以便将每条评论视为单个项目。

对于你的得分,只需添加另一个字段“comment_count”并将其用于你的得分/评分。

答案 1 :(得分:2)

正如Thorsten已经建议你可以使用嵌套查询,这是一个很好的方法。

或者,您可以将注释索引为用户的子项。然后,您可以像现在一样搜索用户,使用top_children查询搜索评论以查找与搜索评论相关的所有评论,最后使用booldis_max将两者的得分合并在一起查询。

嵌套方法在搜索过程中会更有效,但每次添加其他注释时,您都必须重新索引用户和所有注释。使用子/父方法,您只需要为新注释编制索引,但搜索速度会变慢,并且需要更多内存。