在像Elasticsearch這樣的分佈式系統中執行徹底sql風格的join代價很是高,相反,Elasticsearch提供了兩種旨在橫向伸縮的join形式。html
nested
查詢文檔可能包含嵌套類型的字段,這些字段用於索引對象數組,其中每一個對象均可以做爲獨立文檔查詢(使用nested
查詢)。sql
has_child
和has_parent
查詢在單個索引中的文檔之間能夠存在聯接字段關係,has_child
查詢返回子文檔與指定查詢匹配的父文檔,而has_parent
查詢返回父文檔與指定查詢匹配的子文檔。數組
還能夠在terms
查詢中查看terms查找機制,它容許你從另外一個文檔中包含的值構建術語查詢。app
嵌套查詢容許查詢嵌套對象/文檔(參見嵌套映射),對嵌套的對象/文檔執行查詢,就好像它們被索引爲獨立的文檔(在內部)同樣,而且結果是根父文檔(或父嵌套映射),下面是咱們將使用的示例映射:elasticsearch
PUT /my_index { "mappings": { "type1" : { "properties" : { "obj1" : { "type" : "nested" } } } } }
下面是一個嵌套查詢用法示例:分佈式
GET /_search { "query": { "nested" : { "path" : "obj1", "score_mode" : "avg", "query" : { "bool" : { "must" : [ { "match" : {"obj1.name" : "blue"} }, { "range" : {"obj1.count" : {"gt" : 5}} } ] } } } } }
查詢path
指向嵌套的對象路徑,query
包括將在嵌套文檔上運行的與直接路徑匹配的查詢,並與根父文檔鏈接,注意,查詢中引用的任何字段都必須使用完整路徑(徹底限定)。ide
score_mode
容許設置內部子匹配如何影響父得分,它默認爲avg
,但能夠是sum
、min
、max
和none
。ui
還有一個ignore_unmapped
選項,當設置爲true
時,它會忽略一個未映射的path
,而且不會匹配這個查詢的任何文檔,這在查詢可能具備不一樣映射的多個索引時很是有用。當設置爲false
(默認值)時,若是path
沒有映射,查詢將拋出異常。code
自動支持和檢測多級嵌套,結果是生成一個內部嵌套查詢,若是它存在於另外一個嵌套查詢中,則自動匹配相關的嵌套級別(而不是根)。htm
has_child
過濾器接受要運行的查詢和子類型,並生成子文檔與查詢匹配的父文檔,這裏有一個例子:
GET /_search { "query": { "has_child" : { "type" : "blog_tag", "query" : { "term" : { "tag" : "something" } } } } }