首页 文章

使用Solr faceting和pivoting以及日志文件数据查询时间分析

提问于
浏览
1

我正在使用Solr进行一些分析,特别是使用faceting和pivot功能来处理大量日志文件 . 我有一个大型日志文件,我已经在Solr中索引了 .

Keyword  Visits log_date_ISO
1    red      1,938  2013-01-01
2    blue     435    2013-02-01
3    green    318    2013-04-01
4    red blue 279    2013-01-01

然后我通过'log_date_ISO'运行查询和方面,按日期包含查询字词的 keyword 计数 . 两个问题:

(1)有没有办法对每个日期的每个关键字求和 visits - 因为我真正想要的是对包含查询的关键字的访问量进行求和:

  • 例如如果我为上面的内容运行查询'red' - 我希望日期2013-01-01的计数为1938 279 = 2217(即与包含查询'red'的关键字相关联的访问总和)而不是'2'(即包含查询的关键字的计数) .

(2)有没有办法按月查询量进行标准化?

  • 例如如果'2013-01-01'的查询量为10,000,则查询'red'的标准化量将为2217/10000 = 0.2217

最后一个调度:如果这些不可能,我将使用pandas / python预处理日志文件按日期分组,然后按关键字然后规范化 - 但是想知道它是否可能在Solr中 .

提前致谢 .

2 回答

  • 1

    可以使用solr按记录中的一个字段进行分组,并使用分组对记录中的另一个字段进行求和

    (1)构面/枢轴(按指定字段分组数据)(2)StatComponent(计算指定字段的字段统计 - 包括总和)

    我做的调用是(与问题中的名称不同,'关键字'字段称为'q_string','上面的'访问'称为'q_visits','log_date_ISO'在下面称为'q_date'):

    http://localhost:8983/solr/select?q=neuron&stats=true&stats.field=q_visits&rows=1&indent=true&stats.facet=q_date
    

    这提供了基于日期的* q_visits *字段的基本统计数据 - 包括总和 - 我感兴趣的具体值是总和:

    <double name="min">1.0</double>
    <double name="max">435.0</double>
    <long name="count">263</long>
    <long name="missing">0</long>
    <double name="sum">845.0</double>
    <double name="sumOfSquares">192917.0</double>
    <double name="mean">3.2129277566539924</double>
    <double name="stddev">26.94368427501248</double>
    

    收集静态的字段在schema.xml中声明为float类型(如果声明为字符串,则sum,sd,mean将不会显示) .

  • 0

    这是一种方式(类似于Dan Allen's answer here):

    In [11]: keywords = df.pop('Keyword').apply(lambda x: pd.Series(x.split())).stack()
    
    In [12]: keywords.index = keywords.index.droplevel(-1)
    
    In [13]: keywords.name = 'Keyword'
    
    In [14]: df1 = df.join(keywords)
    
    In [15]: df1
    Out[15]:
       Visits  log_date_ISO  Keyword
    1    1938    2013-01-01      red
    2     435    2013-02-01     blue
    3     318    2013-04-01    green
    4     279    2013-01-01      red
    4     279    2013-01-01     blue
    

    然后你可以做相关的组:

    In [16]: df1.groupby(['log_date_ISO', 'Keyword']).sum()
    Out[16]:
                            Visits
    log_date_ISO  Keyword
    2013-01-01    blue         279
                  red         2217
    2013-02-01    blue         435
    2013-04-01    green        318
    

    为了获得百分比的访问(以避免重复计算),我会做一个transform first

    df['VisitsPercentage'] = df.groupby('log_date_ISO')['Visits'].transform(lambda x: x / x.sum())
    
    # follow the same steps as above
    
    In [21]: df2 = df.join(keywords)
    
    In [22]: df2
    Out[22]:
       Visits  log_date_ISO  VisitsPercentage  Keyword
    1    1938    2013-01-01          0.874154      red
    2     435    2013-02-01          1.000000     blue
    3     318    2013-04-01          1.000000    green
    4     279    2013-01-01          0.125846      red
    4     279    2013-01-01          0.125846     blue
    

相关问题