嵌套的弹性搜索聚合
Elastic Search aggregation nested
我必须按标签对演员的电影进行聚合
例如,我想查看小罗伯特·德尼 (Robert Deni Jr) 的所有电影标签。
例如:动作片 (10) 大片 (4) 浪漫片 (2)
如果我的用户通过标签(动作)过滤 Robert Deni Jr. 电影,则需要更新过滤器。如果我检查 romance 然后 : action (1) blockbuster(2) romance (2)
这是我的映射:
"mapping": {
"actor": {
"properties": {
"id": {
"type": "keyword"
},
"name": {
"type": "text"
},
"movies": {
"type": "nested",
"properties": {
"id": {
"type": "keyword"
},
"studio": {
"type": "nested",
"properties": {
"id": {
"type": "keyword"
},
"label": {
"type": "text"
}
}
},
"tags": {
"type": "nested",
"properties": {
"id": {
"type": "keyword"
},
"label": {
"type": "text"
}
}
}
}
}
}
}
}
}
这是我的查询
{
"query": {
"bool": {
"filter": [
{
"match": {
"id": {
"query": 587
}
}
},
{
"bool": {
"must": [
{
"nested": {
"path": "movies",
"query": {
"nested": {
"path": "movies.tags",
"query": {
"term": {
"movies.tags.id": {
"value": 5189,
"boost": 1
}
}
}
}
}
}
}
]
}
}
]
}
},
"aggs": {
"tags": {
"nested": {
"path": "movies.tags"
},
"aggs": {
"tags": {
"terms": {
"field": "movies.tags.id",
"size": 100
}
}
}
}
}
}
我的聚合忽略了给定的标签。我可以按标签过滤,也可以不过滤,聚合结果不会改变。
有什么想法吗?
您是否有理由将标签查询嵌套两次?首先你说 movies
然后 movie.tags
这可能是你没有得到想要的结果的原因。试试这个
{
"query":{
"bool":{
"filter":[
{
"match":{
"id":{
"query":587
}
}
},
{
"bool":{
"must":[
{
"nested":{
"path":"movies",
"query":{
"term":{
"movies.tags.id":{
"value":5189,
"boost":1
}
}
}
}
}
]
}
}
]
}
},
"aggs":{
"tags":{
"nested":{
"path":"movies.tags"
},
"aggs":{
"tags":{
"terms":{
"field":"movies.tags.id",
"size":100
}
}
}
}
}
}
如果它不起作用,请分享您的一部分数据。
另外请注意,当您应用查询限制时,您的聚合也会受到影响。如果您想在没有 Robert Downey 限制的情况下(通常是这种情况)聚合整个索引,则可以使用 .
我必须按标签对演员的电影进行聚合
例如,我想查看小罗伯特·德尼 (Robert Deni Jr) 的所有电影标签。 例如:动作片 (10) 大片 (4) 浪漫片 (2)
如果我的用户通过标签(动作)过滤 Robert Deni Jr. 电影,则需要更新过滤器。如果我检查 romance 然后 : action (1) blockbuster(2) romance (2)
这是我的映射:
"mapping": {
"actor": {
"properties": {
"id": {
"type": "keyword"
},
"name": {
"type": "text"
},
"movies": {
"type": "nested",
"properties": {
"id": {
"type": "keyword"
},
"studio": {
"type": "nested",
"properties": {
"id": {
"type": "keyword"
},
"label": {
"type": "text"
}
}
},
"tags": {
"type": "nested",
"properties": {
"id": {
"type": "keyword"
},
"label": {
"type": "text"
}
}
}
}
}
}
}
}
}
这是我的查询
{
"query": {
"bool": {
"filter": [
{
"match": {
"id": {
"query": 587
}
}
},
{
"bool": {
"must": [
{
"nested": {
"path": "movies",
"query": {
"nested": {
"path": "movies.tags",
"query": {
"term": {
"movies.tags.id": {
"value": 5189,
"boost": 1
}
}
}
}
}
}
}
]
}
}
]
}
},
"aggs": {
"tags": {
"nested": {
"path": "movies.tags"
},
"aggs": {
"tags": {
"terms": {
"field": "movies.tags.id",
"size": 100
}
}
}
}
}
}
我的聚合忽略了给定的标签。我可以按标签过滤,也可以不过滤,聚合结果不会改变。
有什么想法吗?
您是否有理由将标签查询嵌套两次?首先你说 movies
然后 movie.tags
这可能是你没有得到想要的结果的原因。试试这个
{
"query":{
"bool":{
"filter":[
{
"match":{
"id":{
"query":587
}
}
},
{
"bool":{
"must":[
{
"nested":{
"path":"movies",
"query":{
"term":{
"movies.tags.id":{
"value":5189,
"boost":1
}
}
}
}
}
]
}
}
]
}
},
"aggs":{
"tags":{
"nested":{
"path":"movies.tags"
},
"aggs":{
"tags":{
"terms":{
"field":"movies.tags.id",
"size":100
}
}
}
}
}
}
如果它不起作用,请分享您的一部分数据。
另外请注意,当您应用查询限制时,您的聚合也会受到影响。如果您想在没有 Robert Downey 限制的情况下(通常是这种情况)聚合整个索引,则可以使用