我知道在Elasticsearch中使用“JOIN”效率不高,但我需要使用它。 我必须通过查找索引A和索引B的相同字段来提取值。 下面有一个例子。
A/type1/1
{
“serial”:“abc”,
“member”:“jack”
}
A/type1/2
{
“serial”:“def”,
“member”:“jack”
}
B/type2/1
{
“serial”:“abc”,
“temp”:1
}
B/type3/2
{
“serial”:“abc”,
“water”:0
}
B/type2/3
{
“serial”:“def”,
“temp”:10
}
我需要过滤A索引的'member'字段的值来找到相应的serial
,然后我想得到temp
和{{1的值B索引中的字段。
ex)过滤器:water
===> {“member”:“jack”}
我想知道我是否能得到这个结果,如果是这样,我如何建立数据结构(索引结构)。
答案 0 :(得分:1)
如果可能的话,你肯定应该做评论者Val建议的,非规范化(展平)你的数据。我建议,例如,您可以使用这样的文档(基本上,在索引之前加入):
B/type2/1 {"serial": "abc", "temp": 1, "member": "jack"}
B/type2/2 {"serial": "abc", "water": 0, "member": "jack"}
B/type2/3 {"serial": "def", "temp": 10, "member": "jack"}
然后,如果您搜索{"match": {"member": "jack"}}
,您将获得所有这些文件。有两种方法可以做"加入"在Elasticsearch中,parent-child relationships和nested objects。以下是如何使用嵌套对象创建映射的示例:
{
"type1": {
"properties": {
"serial": {"type": "keyword"},
"member": {"type": "keyword"},
"type2s": {
"type": "nested",
"properties": {
"temp": {"type": "integer"},
"water": {"type": "integer"}
}
}
}
}
}
然后你会存储这样的记录:
{
"serial": "abc",
"member": "jack",
"type2s": [
{
"temp": 1
},
{
"water": 0
}
}
}
但是,我强烈建议你不要这样做,除非你绝对必须这样做!这是一个好主意的用例很少见。它使您的数据查询更加复杂,而且效率低下(因此,您的数据会扩展,您将很快就会遇到问题)。
我知道"重复"感觉不对数据。在关系数据库中这将是一种可怕的做法。您必须开发一种不同的思维方式,以便在Elasticsearch中进行有效和高效的数据建模,其中一个不同之处在于您不必过于担心重复数据。