排除具有不同字段的重要术语聚合

时间:2019-10-23 10:37:00

标签: elasticsearch aggregation recommendation-engine elasticsearch-aggregation significant-terms

是否可以使用要过滤的多个字段来过滤重要术语聚合的存储桶列表结果? 我正在尝试根据介质https://towardsdatascience.com/how-to-build-a-recommendation-engine-quick-and-simple-aec8c71a823e上的本文使用ES创建推荐功能。

我将搜索数据存储为对象数组而不是字符串数组,因为我需要过滤其他字段以获得正确的存储区列表结果。这是索引映射:

{
  "mapping": {
    "properties": {
      "user": {
        "type": "keyword",
        "ignore_above": 256
      },
      "comic_subscribes": {
        "properties": {
          "genres": {
            "type": "keyword",
            "ignore_above": 256
          },
          "id": {
            "type": "keyword",
            "ignore_above": 256
          },
          "type": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

我有2个要过滤的条件:

  1. comic_subscribes.type必须仅是“序列”
  2. comic_subscribes.genre不得使用“无尽”或“ echii”

我已经尝试了两种方法来应用条件。首先,我尝试使用像这样的布尔查询来过滤它:

{
    "size": 0,
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "comic_subscribes.id": "1"
                    }
                }
            ],
            "minimum_should_match": 1,
            "filter": {
                "term": {
                    "comic_subscribes.type": "serial"
                }
            },
            "must_not": [
                {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "comic_subscribes.genres": "hentai"
                                }
                            },
                            {
                                "term": {
                                    "comic_subscribes.genres": "echii"
                                }
                            }
                        ],
                        "minimum_should_match": 1
                    }
                }
            ]
        }
    },
    "aggs": {
        "recommendations": {
            "significant_terms": {
                "field": "comic_subscribes.id",
                "exclude": ["1"],
                "min_doc_count": 1,
                "size": 10
            }
        }
    }
}

和过滤器聚合方法:

{
    "size": 0,
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "comic_subscribes.id": "1"
                    }
                }
            ],
            "minimum_should_match": 1
        }
    },
    "aggs": {
        "filtered": {
            "filter": {
                "bool": {
                    "filter": {
                        "term": {
                            "comic_subscribes.type": "serial"
                        }
                    },
                    "must_not": [
                        {
                            "bool": {
                                "should": [
                                    {
                                        "term": {
                                            "comic_subscribes.genres": "hentai"
                                        }
                                    },
                                    {
                                        "term": {
                                            "comic_subscribes.genres": "echii"
                                        }
                                    }
                                ],
                                "minimum_should_match": 1
                            }
                        }
                    ]
                }
            },
            "aggs": {
                "recommendations": {
                    "significant_terms": {
                        "field": "comic_subscribes.id",
                        "exclude": ["1"],
                        "min_doc_count": 1,
                        "size": 10
                    }
                }
            }
        }
    }
}

但是,这两种方法都给了我未过滤的漫画桶清单。是否有其他方法可以达到这些要求的条件?我是否应该再创建一个存储预先过滤的漫画列表的字段以用作源字段重要术语?非常感谢。

1 个答案:

答案 0 :(得分:1)

好,兄弟。我认为没有选择方法可以使用其他字段来过滤聚合有效项存储桶列表结果。

基于针对Significant Terms Aggregation Parameters的Elasticsearch文档Terms Aggregation Filtering Value。除了使用分区表达式的过滤器和具有确切值的过滤器值(我一直在使用,“排除” 参数)。

因此,我通过获取要排除的漫画ID并将其存储为数组中的excludeComics变量来创建其他方法。然后在 exclude 参数中使用excludeComics变量。和繁荣,你去。筛选出的重要术语聚合存储桶列表结果。