文档子集上的 Solr 方面
Solr facet on subset of documents
我有 Solr 文档可以有 3 种可能的状态(state_s
in {new, updated, lost})。这些文档有一个名为 ip_s
的字段。这些文档还有一个可以等于 0 的字段 nlink_i
。
我想知道的是:我有多少新的ip_s。我认为新 ip 是属于 state_s="new"
的文档的 ip,该文档没有出现在 state_s = "updated"
或 state_s = "lost"
.
的任何文档中
使用 Solr facet search 我找到了一个使用以下查询参数的解决方案:
- q=sate_s:"lost"+OR+sate_s:"updated"
- facet=true&facet.field=ip_s&facet.limit=-1
基本上都是
中的ip
"facet_fields":{
"ip_s":[
"105.25.12.114",1,
"105.25.15.114",1,
"114.28.65.76",0,
...]
出现 0 次(例如 114.28.65.76)是 "new ips"。
Q1:有没有更好的方法来做这个搜索。因为使用上面描述的方面查询,我仍然需要读取 ip_s 的列表并计算出现次数 = 0 的所有 ip。
问题 2:如果我想做同样的搜索,(即获取新的 ip)但我只想考虑 nlink_i>0 的文件,我该怎么办?。如果我添加一个过滤器:fq=nlink_i:[1 TO *]
所有出现在 link_i=0 的文档中的 ip 也将它们的出现次数设置为 0。所以我不能不应用上述解决方案来获取新 ip。
Q1:为了避免 0 计数方面,您可以使用 facet.mincount=1。
Q2:我觉得上面的解决方案也应该回答Q2?
您可以使用 Solr grouping functionality 作为分面的替代方法。 Q1 的值聚合并没有变得更好,但至少 Q2 也能正常工作。它看起来像:
select?q=*:*&group=true&group.field=ip_s&group.sort=state_s asc&group.limit=1
为了使您的程序化聚合逻辑起作用,您必须将新条目的 state_s 值更改为升序时首先出现的值。然后,您会将包含带有 "new-state-document" 的文档的所有组都算作第一个条目。如果将 fq 参数添加到地址 Q2,相同的逻辑仍然有效。
我找到了另一个使用 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
我有 Solr 文档可以有 3 种可能的状态(state_s
in {new, updated, lost})。这些文档有一个名为 ip_s
的字段。这些文档还有一个可以等于 0 的字段 nlink_i
。
我想知道的是:我有多少新的ip_s。我认为新 ip 是属于 state_s="new"
的文档的 ip,该文档没有出现在 state_s = "updated"
或 state_s = "lost"
.
使用 Solr facet search 我找到了一个使用以下查询参数的解决方案:
- q=sate_s:"lost"+OR+sate_s:"updated"
- facet=true&facet.field=ip_s&facet.limit=-1
基本上都是
中的ip"facet_fields":{
"ip_s":[
"105.25.12.114",1,
"105.25.15.114",1,
"114.28.65.76",0,
...]
出现 0 次(例如 114.28.65.76)是 "new ips"。
Q1:有没有更好的方法来做这个搜索。因为使用上面描述的方面查询,我仍然需要读取 ip_s 的列表并计算出现次数 = 0 的所有 ip。
问题 2:如果我想做同样的搜索,(即获取新的 ip)但我只想考虑 nlink_i>0 的文件,我该怎么办?。如果我添加一个过滤器:fq=nlink_i:[1 TO *]
所有出现在 link_i=0 的文档中的 ip 也将它们的出现次数设置为 0。所以我不能不应用上述解决方案来获取新 ip。
Q1:为了避免 0 计数方面,您可以使用 facet.mincount=1。
Q2:我觉得上面的解决方案也应该回答Q2?
您可以使用 Solr grouping functionality 作为分面的替代方法。 Q1 的值聚合并没有变得更好,但至少 Q2 也能正常工作。它看起来像:
select?q=*:*&group=true&group.field=ip_s&group.sort=state_s asc&group.limit=1
为了使您的程序化聚合逻辑起作用,您必须将新条目的 state_s 值更改为升序时首先出现的值。然后,您会将包含带有 "new-state-document" 的文档的所有组都算作第一个条目。如果将 fq 参数添加到地址 Q2,相同的逻辑仍然有效。
我找到了另一个使用 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