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