悟空,拿我的打狗棒来

该如何一次查询中实现:过滤得到多个子实体同时在一个父实体的父实体分页列表?

Elasticsearch | 作者 the_best | 发布于2018年10月16日 | 阅读数:1973

举例:
       邮件与邮件参与人为一对多的业务场景,现在想搜索多个参与人同时都在的邮件列表(搜索条件为参与人表的一些字段),ES中该如何设计数据结构?以及该如何查询?
以下是我自己的思考点:
(1)将一对多的两张表进行宽表化设计(冗余邮件表),消除join操作,但是想实现上述的搜索需求,不知道该如何更好地写查询?
(2)嵌套文档方式,通过嵌套查询貌似也不能很好地实现上述查询需求。
(3)父子文档方式,实现上述方式,在一次查询中就会使用多个`has_child`过滤器,父子文档方式本来查询性能就不好(特别是数据量大的时候),这也违背了官方文档给的使用建议(建议不要使用多个has_child过滤器)
 
感觉这种查询需求就算是在mysql关系数据库中实现,写SQL也不好写,想在一次查询搜出结果(分页显示),肯定得使用子查询各种组装,性能值得怀疑?
 
对于这样的查询需求,你们有更好地解决方式吗?欢迎指教,谢谢!
已邀请:

rochy - rochy_he

赞同来自:

参与人字段可以将参与人的 id 全部拼接为一个字符串,例如参与人有:A、B、C
生成视图的时候存储为:"A、B、C",然后针对这个字段设置正则表达式分词器,按照 、进行分词,这样分词结果就是 A/B/C
你搜索的时候如果想查询 A和B 都在的邮件可以使用 boolQuery().must("joined_ids", "A").must("joined_ids", "B")

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

简化设计,邮箱参与人设置为数组类型,对应keyword类型,存储多个即为数组。
查询的时候通过:terms 多个用户匹配。
感觉您的需求还不涉及到父子文档和nested嵌套类型呢。
 
 

要回复问题请先登录注册