1

_search 和 _count 似乎采用不同的查询格式。例如,这是我的_search查询:

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

但为了_count理解它,我需要删除外部query

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

那一个将无法使用_search。只是为了让我更加困惑,_search如果两者都被删除,将接受query filtered

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

那么在使用_searchvs.时,Query DSL 的实际规则是什么_count

4

1 回答 1

4

搜索是 elasticsearch 中最复杂的操作之一,因此它在顶层接受多个不同的参数,包括、queryfilter等。facetssize

query参数应包含查询 DSL 定义的查询。它可以是任何查询,包括match_allor filtered。例如,下面是搜索请求接受所有记录并返回前 20 条的样子。

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

搜索请求中的filter参数可以接受过滤器(同样在 Query DSL 中定义)。此过滤器在搜索中具有特殊功能 - 它不会影响请求中的任何方面。filter因此,当您想要过滤搜索结果但又不想影响分面时,通常只将参数用于分面搜索是有意义的。在所有其他情况下,filtered查询通常会产生更快的结果。

说起来,filtered查询就是查询,所以可以用在query搜索请求的参数中。这也是一个复合查询。它在其参数中接受另一个查询并在其query参数中接受一个过滤器,filter并生成一个复合查询,该查询仅返回满足查询和它所包含的过滤器的文档。换句话说,查询filter中的参数filtered影响搜索结果和分面,而查询filter中的参数search只影响搜索结果,不影响分面。

最后是count请求。请求比请求count简单得多search。它不适用于构面,并且 size 参数实际上没有多大意义,因为我们总是要求完整计数。因此,所有count请求所期望的只是顶层的一个查询。例如,为了计算所有文档,count请求将包含如下内容:

{
    "match_all": {}
}
于 2013-01-24T02:16:25.653 回答