0

我有一个具有以下结构的索引。

{
      "title": "Your top FIY tips",
      "content": "Fix It Yourself in April 2012.",
      "tags": [
        {
          "tagName": "Fix it yourself"
        },
        {
          "tagName": "customer tips"
        },
        {
          "tagName": "competition"
        }
      ]  
}

映射看起来像

{
"articles": {
"mappings": {
  "article": {
    "properties": {
      "content": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "tags": {
        "type": "nested",
        "properties": {
          "tagName": {
            "type": "text",
            "fields": {
              "raw": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}
}

我正在使用以下 DSL 查询来搜索“内容”和“标题”字段,并将结果缩小到某个“标签名称”。然后使用聚合来计算该查询中的 tagNames。

GET /articles/_search
{
  "from": 1,
  "size": 10,
  "aggs": {
    "tags": {
      "nested": {
        "path": "tags"
      },
      "aggs": {
        "tags-tagnames": {
          "terms": {
            "field": "tags.tagName.raw"
          }
        }
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "FIY",
            "fields": [
              "title",
              "content"
            ]
          }
        },
        {
          "nested": {
            "query": {
              "terms": {
                "tags.tagName": [
                  "competition"
                ]
              }
            },
            "path": "tags"
          }
        }
      ]
    }
  }
}

“tagNames”的搜索查询和过滤器工作正常。然而,聚合并不完全有效。它似乎没有在结果中包含嵌套查询数据。返回的聚合结果只是基于多匹配搜索。

如何在聚合中包含嵌套查询。

样本文件在

https://gist.github.com/anonymous/83bc2b1bfa0ac0d295d42297e1d76c00

4

1 回答 1

1

经过讨论,我想我更了解您的问题:

您希望仅对那些基于查询中指定的"from"和包含的文档运行聚合。"size"

"from"仅影响为查询返回的命中,聚合计算将匹配查询的所有文档。

由于 Elasticsearch 的工作方式,您目前无法执行此操作。Elasticsearch 中的搜索请求有两个阶段:

查询阶段

查询阶段是查询集群中的所有分片时,返回与查询匹配的文档的文档 ID。聚合也在查询阶段运行。

获取阶段

在 fetch 阶段,与查询阶段的 id 匹配的实际文档被提取并包含在结果中。在您的场景中,您需要聚合在 fetch 阶段运行,仅聚合查询阶段包含的那些文档。

影响聚合考虑哪些文档的唯一方法是在请求的查询中包含其他查询/过滤器,但就我而言,没有查询说“排序顺序位置 1 到 10 的文档”知道的。

您总是可以在这里为您的特定用例聚合客户端,因为您正在有效地聚合每个标签中的逐字值

于 2017-03-17T23:56:27.717 回答