嵌套字段上的 ElasticSearch 聚合
ElasticSearch aggregates on nested fields
我有一个具有以下结构的索引。
{
"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 查询在 "content" 和 "title" 字段上进行搜索,并将结果缩小到某个 "tagName"。然后使用聚合计算该查询中的 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
经过讨论,我觉得我更理解你的问题了:
you wish to run the aggregation only on those documents that are included based on the "from"
and "size"
specified in the query.
"from"
仅影响为查询返回的命中,聚合计算将匹配查询的 所有 文档。
由于 Elasticsearch 的工作方式,您目前无法执行您想要执行的操作。 Elasticsearch 中的搜索请求分为两个阶段:
查询阶段是查询集群中的所有分片时,返回匹配查询的文档的文档id。 聚合也在查询阶段运行。
在获取阶段,与查询阶段的 ID 匹配的实际文档被获取并包含在结果中。在您的场景中,您需要在获取阶段聚合到 运行,以便仅聚合查询阶段包含的那些文档。
影响聚合考虑哪些文档的唯一方法是在请求的查询中包含额外的 queries/filters,但没有查询说 "documents in sort order positions 1 to 10"我知道了。
您始终可以在此处针对您的特定用例聚合客户端,因为您正在有效地聚合每个标签中的逐字值
我有一个具有以下结构的索引。
{
"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 查询在 "content" 和 "title" 字段上进行搜索,并将结果缩小到某个 "tagName"。然后使用聚合计算该查询中的 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
经过讨论,我觉得我更理解你的问题了:
you wish to run the aggregation only on those documents that are included based on the
"from"
and"size"
specified in the query.
"from"
仅影响为查询返回的命中,聚合计算将匹配查询的 所有 文档。
由于 Elasticsearch 的工作方式,您目前无法执行您想要执行的操作。 Elasticsearch 中的搜索请求分为两个阶段:
查询阶段是查询集群中的所有分片时,返回匹配查询的文档的文档id。 聚合也在查询阶段运行。
在获取阶段,与查询阶段的 ID 匹配的实际文档被获取并包含在结果中。在您的场景中,您需要在获取阶段聚合到 运行,以便仅聚合查询阶段包含的那些文档。
影响聚合考虑哪些文档的唯一方法是在请求的查询中包含额外的 queries/filters,但没有查询说 "documents in sort order positions 1 to 10"我知道了。
您始终可以在此处针对您的特定用例聚合客户端,因为您正在有效地聚合每个标签中的逐字值