1.关联关系处理
1.应用层联接
在我们的应用程序中实现联接可以(部分)模拟关系数据库
![71ee6a86a3c62e9ad64c198f746c2f92.png](https://i-blog.csdnimg.cn/blog_migrate/2bca070c504f878df143da4ea0a6b466.jpeg)
执行第一个查询得到的结果将填充到 terms
过滤器中
优点:
可以对数据进行标准化处理。
缺点:
在搜索时联接文档,需要额外的查询。
该方法适用于第一个实体只有少量文档记录的情况,并且最好他们很少改变。
这将允许应用程序对结果进行缓存,并避免经常运行第一次查询。
2.非规范化你的数据
1.对每个文档保持一定数量的冗余副本可以在需要访问时避免进行关联
![c376ac559df3fac2932fdf1a500f75d3.png](https://i-blog.csdnimg.cn/blog_migrate/dc0f8b5b7b014554d2a319a80b221c32.png)
这部分用户的字段数据已被冗余到 blogpost
文档中
数组类型:
在同一个数组中,数组元素的数据类型是相同的,ElasticSearch不支持元素为多个数据类型:[ 10, "some string" ],常用的数组类型是:
-
-
- 字符数组: [ "one", "two" ]
- 整数数组: productid:[ 1, 2 ]
- 对象(文档)数组: "user":[ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }],ElasticSearch内部把对象数组展开为 {"user.name": ["Mary", "John"], "user.age": [12,10]}
-
注意:对于文档(对象)数组,每个元素都是结构相同的文档,文档之间都不是独立的,在文档数组中,不能独立于其他文档而去查询单个文档,这是因为,一个文档的内部字段之间的关联被移除,各个文档共同构成对象数组。
优点:
查询速度快,因为每个文档都包含了所需的所有信息,当这些信息需要查询匹配时,不需要进行昂贵的联接操作
缺点:
1.每个文档的 _source
将会更大,并且这里有很多的索引字段,占用的磁盘空间比较大
2.名称更改,批量更新问题
非规范化并发以及解决方式:
场景:
多人同时操作同一条数据,es对单文档支持ACIDic,对于多个文档的变更不支持ACID(事务)。
关系型数据库为主:
如果你的主要数据存储是关系数据库,并且 Elasticsearch 仅仅作为一个搜索引擎 或一种提升性能的方法,可以首先在数据库中执行变更动作,然后在完成后将这些变更复制到 Elasticsearch。 通过这种方式,你将受益于数据库 ACID 事务支持,并且在 Elasticsearch 中以正确的顺序产生变更。 并发在关系数据库中得到了处理。