2013-01-24 71 views
1

這樣看來,_search和_count採取不同格式的查詢。例如,這是我的_search查詢:彈性搜索_search與_count語法

{ 
    query: { 
    filtered: { 
     query: { match: { Name: "bob" } }, 
     filter: { term: { GroupIds: 3 } } 
    } 
    } 
} 

但是爲了_count理解它,我需要刪除外query

{ 
    filtered: { 
    query: { match: { Name: "bob" } }, 
    filter: { term: { GroupIds: 3 } } 
    } 
} 

那一個不會與_search工作。使用_search_count

{ 
    query: { match: { Name: "bob" } }, 
    filter: { term: { GroupIds: 3 } } 
} 

那麼什麼是查詢DSL的實際規則:只是爲了進一步迷惑我多,_search會接受它,如果這兩個queryfiltered被刪除?

回答

4

搜索是elasticsearch最複雜的操作之一,因此它接受的最高水平,包括queryfilterfacetssize等幾個不同的參數。

query該參數應包含按查詢DSL所定義的查詢。它可以是包括match_allfiltered任何查詢。例如,下面是搜索請求會是什麼樣子接受所有記錄並返回前20名。

{ 
    "query": { 
     "match_all": {} 
    }, 
    "size": 20 
} 

在搜索請求可以接受濾波器filter參數(如再次在查詢DSL定義)。此過濾器在搜索中具有特殊功能 - 它不會影響請求中的任何方面。因此,通常是有意義的使用filter參數僅與面搜索,當你想過濾的搜索結果,但你不希望影響方面。在所有其他情況下,filtered查詢將通常會產生更快的結果。

說到這,filtered查詢是一個查詢,所以它可以用在搜索請求的query參數中。這也是一個複合查詢。它接受query參數中的另一個查詢以及其filter參數中的過濾器,並生成一個複合查詢,該查詢僅返回同時滿足查詢及其組成的過濾器的文檔。換句話說,filtered查詢中的filter參數影響搜索結果和構面,而search查詢中的filter參數僅影響搜索結果,並且不會影響構面。

最後是count請求。該count請求比search要求簡單得多。它不適用於facet,size參數不會有多大意義,因爲我們總是要求完整的計數。因此,所有count請求都需要在頂層查詢。例如,爲了統計所有文件,count請求將包含如下內容:

{ 
    "match_all": {} 
} 
+0

很好的解釋Igor,像往常一樣! – javanna

+0

感謝您的詳細解釋。現在變得更有意義了。 –

+0

此答案與早期版本的ES相關。在v1.3.4 Count API現在要求我們在外部查詢中打包。 –