2013-01-24 43 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现在要求我们在外部查询中打包。 –