我正在构建一个包含复杂模型的应用程序,Book,User and Review。
评论包含图书和用户ID。 为了能够搜索包含至少一个评论的图书,我将图书设置为评论的父级并且具有此类路由。但是,我还需要找到撰写包含某些短语的评论的用户。
是否可以同时将Book和User作为Review的父级?有没有更好的方法来处理这种情况?
请注意,我无法更改数据的建模方式/不愿意这样做,因为数据会从持久性数据库转移到Elasticsearch。
答案 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 blog或elasticsearch the definitive guide
答案 1 :(得分:0)
答案 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"
}
}
}
}
}
}
]
}
}
}
}
'