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

时间:2013-09-02 21:25:38

标签: search solr lucene pandas analytics

我正在使用Solr进行一些分析,并专门针对大量日志文件使用分面和数据透视功能。我有一个大型日志文件,我已经在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”运行查询和方面,以便按日期包含查询字词的关键字计数。两个问题:

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

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

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

这是一种方式(类似于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

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

答案 1 :(得分:0)

可以使用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将不会显示)。