【问题标题】:Elastic Search - Find Data Common To Multiple Queries弹性搜索 - 查找多个查询共有的数据
【发布时间】:2020-02-10 14:55:37
【问题描述】:

在 Elastic Search 中,我有一个索引,其中包含用户和他们访问过的 URL。我希望能够搜索多个用户并找到他们访问过的常用 URL。

我可以获取单个用户的 URL:

{
    "size": 0,
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query": "user:bob"
                }
            },
            "filter": {
                "bool": {
                    "must": [{
                            "range": {
                                "@timestamp": {
                                    "gte": 1430456930549,
                                    "lte": 1430666630549
                                }
                            }
                        }],
                    "must_not": []
                }
            }
        }
    },
    "aggs": {
        "1": {
            "terms": {
                "field": "url",
                "size": 0,
                "order": {
                    "_count": "desc"
                }
            }
        }
    }
}

但是我如何结合每个用户的结果(做某种交集)。我可以以编程方式执行此操作,但 Elastic Search 可以通过某种聚合来执行此操作吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以在用户术语中使用子聚合、url 术语:

    {
       "query": {
          "match_all": {}
       },
       "aggs": {
          "users": {
             "terms": {
                "field": "user"
             },
             "aggs": {
                "urls": {
                   "terms": {
                      "field": "url"
                   }
                }
             }
          }
       }
    }
    

    这将为您提供用户存储桶,每个用户都包含 URL 存储桶。

    UPD 一开始我误解了你的问题。我不知道您正在寻找这种类型的聚合。但是你可以利用significant terms aggregation:

    {
       "query": {
          "filtered": {
             "filter": {
                "terms": {
                   "user": ["alice", "jack"]
                }
             }
          }
       },
       "aggs": {
          "urls": {
             "significant_terms": {
                "field": "url",
                "size": 5
             }
          }
       }
    }
    

    这将为您提供包含给定用户集中最受欢迎的 URL 的存储桶。请注意,在任何情况下,它都不是一个严格的交集,而是一个列表,其中顶部元素是在所谓的 foreground group(查询范围)中比在 背景组(索引的所有文档)。

    选定用户常用的网址很可能在此聚合中得分较高。

    但是,如果被请求的 2 个用户中的每一个访问她自己喜欢的网站的次数比其他网站多得多,而根本没有访问其他用户最喜欢的网站,那么这两个网址仍然会出现,并且得分会高于共同的。

    通常我建议探索这种聚合,它可以从数据中提供一些有趣的见解。例如,在您的数据集中使用此聚合的更相关用途将是查找在其他网站的访问者中常见的网站。

    您可以在herehere 阅读更多相关信息。

    【讨论】:

    • 感谢您的信息 - 但这会产生与我单独查询每个用户相同的结果,并且它不会执行任何类型的数据合并/相交。
    • @thelok 一开始我误解了你的问题,请参阅有关重要术语聚合的扩展答案。虽然它不能准确地给出您要搜索的内容,但您可以利用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多