Elasticsearch:如何在具有相同会话ID的多个事件上提取可能的模式

时间:2015-03-05 14:52:11

标签: elasticsearch

要点:

我对我的博客使用elasticsearch。我想问一个问题:在一个会话中有多少客户请求了页面A和页面B?

详细信息:

我的Elasticsearch节点包含我网站上记录的事件。每个事件都包含timestamp,url,referrer和session id。此刻我知道如何找到,例如请求url xyz的会话数。但我不知道如何在会话中同时请求页面A和页面B的情况。当然,页面A或B不是推荐人的一部分。 这是在弹性搜索中以某种方式支持的吗?

2 个答案:

答案 0 :(得分:0)

查询应如下所示(假设您的urlsession_idnot_analyzed):

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "url": "[Page A URL]"
              }
            },
            {
              "term": {
                "url": "[Page B URL]"
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "requested_both_pages": {
      "terms": {
        "field": "session_id"
      }
    }
  }
}

回复中的doc_count将是您要查找的号码。

请注意,如果您的网址已经过分析,并且您需要进行模糊匹配,那么您必须使用match查询而不是terms过滤器。我一般不会推荐分析推荐人。相反,我会将其分解为部分,并使用每个字符串not_analyzed创建一个嵌套的url对象,然后使用terms过滤器。如果您需要一些模糊性,您仍可以使用not_analyzed字段进行wildcard query

答案 1 :(得分:0)

我发现了一个查询,该查询至少返回每个会话请求网址A和网址B的次数。我不知道我可以使用这种聚合方式。仍然不是完美的解决方案,因为它可以返回url A有计数和url B没有计数的会话。所以我不会将anwser标记为已解决。除非有专家告诉我,我的要求根本不可能。

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "term": {
                "Url": "[Page A URL]"
              }
            },
            {  
              "term": {
                "Url": "[Page B URL]"
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "sessions_all": {
      "terms": {
        "field": "session_id",
        "size": 100
      },
      "aggs": {
        "Page_A_URL": {
          "filter": {
            "term": {
              "Url": "[Page A URL]"
            }
          }
        },
        "Page_B_URL": {
          "filter": {
            "term": {
              "Url": "[Page A URL]"
            }
          }
        }
      }
    }
  }
}