2017-09-01 29 views
1

我知道它在Elasticsearch中使用「JOIN」效率不高,但我需要使用它。 我必須通過查找索引A和索引B的相同字段來提取值。 下面有一個示例。有沒有類似於Elasticsearch連接的查詢?

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股指數的「成員」字段的值來查找相應的serial,然後我想在B指數tempwater字段的值。 ex)過濾器:{「member」:「jack」} ===>temp:1, water:0, temp:10

我不知道我能否得到這個結果,如果是的話,我該如何建立數據結構(索引結構)。

+2

是否有可能使你的數據非規範化(https://stackoverflow.com/questions/36915428/how-to-setup-elasticsearch-index-structure-with-multiple-entity-bindings/36982705# 36982705)? – Val

回答

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 relationshipsnested 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中進行有效且高效的數據建模,其中一個區別是您不必擔心數據重複。