2012-02-28 94 views
2

请原谅这个问题的潜在缺陷 - 仍然试图让我的头绕过这个非关系型NoSQL的东西。ElasticSearch映射和相关对象

我对ElasicSearch的性能和简单性印象非常深刻,但在我深入研究实现之前,我有一个映射(边界线NoSQL theroy)问题。

让我们继续使用ElasticSearch在其文档中使用的Twitter示例。

基本上,我们知道一条推文属于一个用户,并且用户有很多推文。 的物体看起来是这样的:

user = {'screen_name':'d2kagw', 'id_str':'1234567890', 'favourites_count':'15', ...} 
tweet = {'message':'lorem lipsum...', 'user_id_str':'1234567890', ...} 

什么我不知道的,可以鸣叫的对象具有对用户对象的引用? 因为我希望能够写出查询:

{'query': { 
    'term':{'message':'lipsum'}, 
    'range':{'user.favourites_count':{'from':10, 'to':30'}} 
}} 

,我想返回与用户对象作为响应的一部分匹配的tweet(对具有延迟加载它们更高版本)。

我问得太多了吗?

如果我想以这种方式查询数据,我是否应该将所有用户数据都放入tweet对象中?

在我的实现中(不使用twitter,这只是一个很好的例子)由于我必须查询数据的各种方式,我需要将这两个数据集作为不同的索引,所以我不确定是否我可以使用一个对象类型并具有我需要的索引结构。

在此先感谢您的帮助。

回答

2

ElasticSearch并不真正支持我们在SQL世界中习惯的表连接。最接近它的是Has Child Query,它允许基于另一个表中的记录的持续性将结果限制在一个表中,甚至在这里它仅限于一对多(父 - 子)关系。

因此,在这个世界中的一种常见方法是将所有东西非规范化并一次查询一个索引。

+0

看起来非规范化将成为我们这里最可能的结果。 – d2kagw 2012-02-29 01:53:41

+0

d2kagw:你最终做了什么?我有关于如何存储帐户数据与tweets完全相同的问题。 – 2013-10-17 02:45:08