Elasticsearch 鼓励你在创建索引的时候就 扁平化(denormalizing) 你的数据,这样做可以获取最好的搜索性能。在每一篇文档里面冗余一些数据可以避免join操作。
举个例子,如果我们想通过 user
来查找某一篇 blog
,那么就把 user
的姓名包含在 blog
这个 document 里面,就像这样:
PUT /my_index/user/1
{
"name": "John Smith",
"email": "john@smith.com",
"dob": "1970/10/24"
}
PUT /my_index/blogpost/2
{
"title": "Relationships",
"body": "It's complicated...",
"user": {
"id": 1,
"name": "John Smith" (1)
}
}
(1) user
中的一部分信息已经被包含到 blogpost
里面。
现在,我们只要通过一次查询,就能找到和作者 John
有关系的所有博客:
GET /my_index/blogpost/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "relationships" }},
{ "match": { "user.name": "John" }}
]
}
}
}
扁平化数据的好处就是一个字,快。因为每一篇文档都已经包含了所有需要被查询的信息,所以就没有必要去做消耗很大的join操作了。