扁平化你的数据

Elasticsearch 鼓励你在创建索引的时候就 扁平化(denormalizing) 你的数据,这样做可以获取最好的搜索性能。在每一篇文档里面冗余一些数据可以避免join操作。

举个例子,如果我们想通过 user 来查找某一篇 blog,那么就把 user 的姓名包含在 blog 这个 document 里面,就像这样:

  1. PUT /my_index/user/1
  2. {
  3. "name": "John Smith",
  4. "email": "john@smith.com",
  5. "dob": "1970/10/24"
  6. }
  7. PUT /my_index/blogpost/2
  8. {
  9. "title": "Relationships",
  10. "body": "It's complicated...",
  11. "user": {
  12. "id": 1,
  13. "name": "John Smith" (1)
  14. }
  15. }

(1) user 中的一部分信息已经被包含到 blogpost 里面。

现在,我们只要通过一次查询,就能找到和作者 John 有关系的所有博客:

  1. GET /my_index/blogpost/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. { "match": { "title": "relationships" }},
  7. { "match": { "user.name": "John" }}
  8. ]
  9. }
  10. }
  11. }

扁平化数据的好处就是一个字,快。因为每一篇文档都已经包含了所有需要被查询的信息,所以就没有必要去做消耗很大的join操作了。