Elasticsearch 參考指南(Joining查詢)

Joining查詢

在像Elasticsearch這樣的分佈式系統中執行徹底sql風格的join代價很是高,相反,Elasticsearch提供了兩種旨在橫向伸縮的join形式。html

nested查詢

文檔可能包含嵌套類型的字段,這些字段用於索引對象數組,其中每一個對象均可以做爲獨立文檔查詢(使用nested查詢)。sql

has_childhas_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,但能夠是summinmaxnoneui

還有一個ignore_unmapped選項,當設置爲true時,它會忽略一個未映射的path,而且不會匹配這個查詢的任何文檔,這在查詢可能具備不一樣映射的多個索引時很是有用。當設置爲false(默認值)時,若是path沒有映射,查詢將拋出異常。code

自動支持和檢測多級嵌套,結果是生成一個內部嵌套查詢,若是它存在於另外一個嵌套查詢中,則自動匹配相關的嵌套級別(而不是根)。htm

子查詢

has_child過濾器接受要運行的查詢和子類型,並生成子文檔與查詢匹配的父文檔,這裏有一個例子:

GET /_search
{
    "query": {
        "has_child" : {
            "type" : "blog_tag",
            "query" : {
                "term" : {
                    "tag" : "something"
                }
            }
        }
    }
}
相關文章
相關標籤/搜索