facet vs groupby检索solr中的唯一项列表

时间:2016-04-18 20:08:42

标签: solr lucene

我有两个非常大的solr表,每个记录大约有36,000,000条记录,在solr cloud v4.10上运行。

我正在尝试执行一个查询,它会在给定一些变量的情况下向我返回所有唯一/不同的值。

例如,尝试抓取国家/地区first_name内的所有唯一USA值。我的查询耗时超过90-150秒,这绝对不可用,我想知道我是否会出错。

我尝试过solr facets以及solr groupby,但这两种方法都很疯狂。我可以使用solr术语,但我还没有找到一种方法来使用另一个&fq的术语,所以我现在有两个选项:

使用构面搜索

/solr/a/select?q=country:USA&fq=year_born:[2015+TO+*]
&rows=0&facet=on&facet.limit=-1&facet.field=first_name&wt=json&indent=true

使用Groupby搜索

/solr/a/select?q=country:USA&fl=first_name&fq=year_born:[2015+TO+*]
&group=true&group.limit=1&group.field=first_name&rows=1000000&wt=json&indent=true

使用条款

我可以找回表格中存在的唯一first_name字段,但我无法说只显示美国中的first_names ,所以据我所知,术语不能用于我想要做的事情。

我正在尽我所能限制facetgroupby搜索中返回的记录数量,并将其设为年限(给我一年而不是25年)年,)但查询仍然太费力。

我是否错过了某些特定的solr函数,它正在做我正在尝试做的事情?我需要将所有结果返回给我 - 这就是踢球者 - 我不能将其限制在50或5000的结果,所以在一天结束时,我的输出看起来像这样:

john
bob
mike
tim
robert
dave

出现次数对我来说并不重要

1 个答案:

答案 0 :(得分:1)

最糟糕的情况是,您的所有文件都有国家/地区:美国且所有名字都是唯一的。为了确保正确的结果,必须将来自每个节点的所有结果(意味着3600万)返回给调用者并在那里合并。在Solr 4.x中,这意味着构建潜在的巨大结构并发送它们。

在Solr 5.x中,您可以使用流式传输。它不会改变最坏情况,但是你可以避免内存开销,结果会在很短的时间内开始流入:https://cwiki.apache.org/confluence/display/solr/Streaming+Expressions

在Solr 5.3+中使用JSON Faceting,您可以非常有效地获得分片中唯一值的近似值,但它仍然是实验性的:http://yonik.com/solr-facet-functions/