假设我有两个名为“twitter_user”和“twitter_comments”的表。
twitter_users 包含字段:username和bio twitter_comments 包含字段:用户名和评论
显然,用户在twitter_users中有1个条目,在twitter_comments中有很多条目
我想在弹性搜索中对twitter_users和twitter_comments进行建模,在我查询时让ES搜索这两个模型,知道评论会计入Twitter用户的整体相关性分数。
我知道我可以通过创建一个额外的字段(除了username和bio)以及所有连接的注释来模仿这个模型。但是还有另一种“更清洁”的方式吗?
答案 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查询搜索评论以查找与搜索评论相关的所有评论,最后使用bool或dis_max将两者的得分合并在一起查询。
嵌套方法在搜索过程中会更有效,但每次添加其他注释时,您都必须重新索引用户和所有注释。使用子/父方法,您只需要为新注释编制索引,但搜索速度会变慢,并且需要更多内存。