我正在使用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中。
提前致谢。
答案 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将不会显示)。