有没有办法让Solr仅在文档的结果集上而不是在所有文档中生成Facet计数

时间:2018-05-24 16:33:15

标签: solr facet faceted-search

我正在使用Solr Admin UI来构建此查询:

{ "response": { "numFound": 1, "start": 0, "docs": [ { "id": "TH-1961-46483-10968-9", "externalid": "100700000_00024" } ] }, "facet_counts": { "facet_queries": {}, "facet_fields": { "externalid": [ "100700000_00024", 1, "005471837_00001", 0, "005471837_00002", 0, "005471837_00003", 0, "005471837_00099", 0, .... ] } } }

它返回:

facet_counts

我的假设是它只返回它找到的一个文档的facet计数(因为我指定了我想要的id)。相反,它返回一个externalid结构,其中每个externalid值由Solr索引(被授予...除了一个条目为0之外。与查询匹配的文档的facet.mincount = 1计数为1,因为它很重要成为)。但我只想要搜索结果中的文档的Solr facet计数。不是一切。它会大大减慢查询速度。

是的,我可以设置tracing on;使其仅返回实际上具有计数的分面计数,但是在封面下它看起来仍然看起来正在查看所有文档...而不仅仅是查询的结果集。目前,我们需要2分钟才能对我们的2亿个项目执行上述查询。

当我在cqlsh中转动externalid时,我可以看到它正在处理所有2亿个以上的项目。如果仅计算结果集,则此查询将更快,更快。

<field docValues="true" indexed="true" multiValued="false" name="externalid" stored="true" type="StrField"/> 在模式文件中定义如下:

%% PLOT OF MEAN SEA LEVEL 
%mean sea level in every 12:24.5 Hrs
clc
n = 74; % dataset where in every 10 minutes 74 gives 1-period of tide
a1c = reshape(cumsum(wl1c,2),[],1); % wl1c = 8280x1 matrix of value of waterlevel 1
mwl1c = arrayfun(@(i) mean(a1c(i:i+n-1)),1:n:length(a1c)-n+1)'; % the averaged vector
a2c = reshape(cumsum(wl2c,2),[],1); %  wl2c = 8280x1 matrix of value of waterlevel 2
mwl2c = arrayfun(@(i) mean(a2c(i:i+n-1)),1:n:length(a2c)-n+1)'; % the averaged vector
scatter((1:length(mwl1c))',mwl1c,10);
lsline;
hold on;
scatter((1:length(mwl2c))',mwl2c,10);
lsline;
hold off

我误解了什么? 它正在减慢我的查询,因为必须出去找到所有的externalid,只是说它们的计数为0.

有没有办法告诉Solr faceing只查看从查询中找到的文档?

我在DSE 6.0下的Solr 6

1 个答案:

答案 0 :(得分:0)

您可以通过facet.method参数提供the facet methodfc是默认值,这是您正在寻找的行为 - 您确定DSE默认情况下使用fc作为方法吗? (因为fc的定义是它应该只迭代匹配查询的文档):

  

<强> FC

     

通过迭代与查询匹配的文档计算构面数,并对每个文档中出现的术语求和。

     

如果字段是多值的或被标记化的(根据FieldType.isTokened()),目前使用UnInvertedField缓存实现。在缓存中查找每个文档以查看它包含的条件/值,并为每个值增加一个计数。

     

对于字段的索引值数量较多但每个文档的值数量较少的情况,此方法非常好。对于多值字段,使用混合方法,该方法使用filterCache中的术语过滤器来查找与许多文档匹配的术语。字母fc代表字段缓存。