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

Exclude Significant Term Aggregation With Different Field

是否可以使用多个要过滤的字段来过滤重要术语聚合的桶列表结果? 我正在尝试根据这篇文章在 medium 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 必须是 "serial" 只有
  2. comic_subscribes.genre 不得在 "hentai" 或 "echii"

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

{
    "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
                    }
                }
            }
        }
    }
}

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

好的,兄弟们。我认为没有选项方法可以使用不同的字段过滤聚合重要术语存储桶列表结果。

基于 elasticsearch 文档 Significant Terms Aggregation Parameters, which refers to Terms Aggregation Filtering Value。除了 filter using partition expressionfilter values with exact values(我一直在使用, "exclude" 参数).

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