我有可能有3种可能状态的Solr文档({new,updated,lost}中的state_s
)。这些文档有一个名为ip_s
的字段。这些文档还有一个字段nlink_i
,可以等于0.
我想知道的是:我有多少新ip_s。我认为新ip是属于文档的IP,其state_s="new"
未出现在state_s = "updated"
或state_s = "lost"
的任何文档中。
使用Solr facet搜索我找到了一个使用以下查询参数的解决方案:
基本上,所有ip in
"facet_fields":{
"ip_s":[
"105.25.12.114",1,
"105.25.15.114",1,
"114.28.65.76",0,
...]
<0>出现0(例如114.28.65.76)是&#34;新的ips&#34;。
Q1:有没有更好的方法来进行此搜索。因为使用上面描述的构面查询,我仍然需要读取ip_s列表并使用occurence = 0计算所有ip。
Q2:如果我想进行相同的搜索,(即获取新的ip),但我想只考虑nlink_i> 0的文件,我该怎么办?如果我添加一个过滤器:fq=nlink_i:[1 TO *]
所有出现在link_i = 0的文档中的ip也会将其出现次数设置为0.所以我不能不应用上面描述的解决方案来获取新的ip。
答案 0 :(得分:1)
Q1:要避免0计数方面,可以使用facet.mincount = 1。
Q2:我认为上面的解决方案也应该回答Q2?
答案 1 :(得分:1)
除了facet之外,您还可以使用Solr grouping functionality。 Q1的值汇总不会好得多,但至少Q2也能正常工作。它看起来像是:
select?q=*:*&group=true&group.field=ip_s&group.sort=state_s asc&group.limit=1
为了使编程聚合逻辑起作用,您必须将新条目的state_s值更改为首先出现的升序排序。然后,您将计算包含具有“新状态文档”的文档的所有组作为第一个条目。如果将fq参数添加到地址Q2,则相同的逻辑仍然有效。
答案 2 :(得分:0)
我发现使用facet.pivot的另一个解决方案适用于Q1和Q2:
http://localhost:8983/solr/collection1/query?q=nbLink_i:[1%20TO%20*]&updated&facet=true&facet.pivot=ip_s,state_s&facet.limit=-1&rows=0