4

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

twitter_users具有字段:用户名和生物 twitter_comments具有字段:用户名和评论

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

我想在 Elastic Search 中为 twitter_users 和 twitter_comments 建模,在我查询时让 ES 搜索这两个模型,因为我知道评论计入 Twitter 用户的整体相关性得分。

我知道我可以通过创建一个额外的字段(除了用户名和简历)并连接所有评论来仅使用 1 个模型来模仿这一点。但是还有另一种“更清洁”的方式吗?

4

2 回答 2

8

这取决于。

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

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

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

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

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

于 2012-11-17T09:16:11.380 回答
2

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

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

嵌套方法在搜索期间会更有效,但每次添加附加评论时,您都必须重新索引用户和所有评论。使用子/父方法,您只需要索引新评论,但搜索会更慢并且需要更多内存。

于 2012-11-17T13:50:12.613 回答