Solr关于文档子集的方面

时间:2015-02-12 16:25:53

标签: solr facet

我有可能有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搜索我找到了一个使用以下查询参数的解决方案:

  • Q = sate_s:"丢失&#34 + OR + sate_s:"更新"
  • 面=真安培; facet.field = ip_s&安培; facet.limit = -1

基本上,所有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。

3 个答案:

答案 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