请原谅这个问题的潜在的无意义 - 仍然试图让我的头脑围绕这个非关系型 NoSQL 的东西。
ElasicSearch 的性能和简单性给我留下了深刻的印象,但在深入实现之前,我有一个映射(边界 NoSQL 理论)问题需要回答。
让我们继续使用 ElasticSearch 文档中的 Twitter 示例。
基本上,我们知道一条推文属于一个用户,并且一个用户有很多条推文。 这些对象看起来像这样:
user = {'screen_name':'d2kagw', 'id_str':'1234567890', 'favourites_count':'15', ...}
tweet = {'message':'lorem lipsum...', 'user_id_str':'1234567890', ...}
我想知道的是,tweet 对象可以引用用户对象吗? 因为我希望能够编写如下查询:
{'query': {
'term':{'message':'lipsum'},
'range':{'user.favourites_count':{'from':10, 'to':30'}}
}}
我想返回与用户对象匹配的推文作为响应的一部分(而不是稍后必须延迟加载它们)。
我的要求是不是太高了?
如果我想以这种方式查询数据,是否应该将所有用户数据放入 tweet 对象中?
在我的实现中(不使用 Twitter,这只是一个优雅的示例),由于我必须以多种方式查询数据,因此我需要将两个数据集作为不同的索引,所以我不确定是否我可以使用对象类型并具有我需要的索引结构。
预先感谢您的帮助。
最佳答案
ElasticSearch 并不真正支持我们在 SQL 世界中习惯的表连接。最接近的是 Has Child Query它允许根据另一个表中记录的存在来限制一个表中的结果,甚至在这里它也仅限于一对多(父子)关系。
因此,这个世界上的一种常见方法是对所有内容进行非规范化并一次查询一个索引。
关于lucene - ElasticSearch 映射和相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9478089/