Apache Solr JSON刻面API相关度和语义知识图

2020-07-10 06:01:39

JSON刻面模块公开了与Solr的传统刻面模块类似的功能,但更加强调可用性。与传统的镶嵌面相比,它有几个好处:

JSON提供的嵌套和结构使刻面比传统刻面API的平面命名空间更易于阅读和理解。

计算给定存储桶数据的方面(通常是度量、统计或分析函数)。

下面是一个分组面的示例,它根据cat字段(CATEGORY的缩写)将文档划分到存储桶中,并返回前3个存储桶:

cURL http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";方面";:{";类别";:{";类型";:";术语";,";字段";:";CAT";,";限制";:3})';

Final TermsFactMap Category yFacet=new TermsFactMap(";cat";)。setLimit(3);最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。with Facet(";Categories";,Category yFacet);QueryResponse queryResponse=Request。process(solrClient,Collection_name);

下面的响应显示有32个文档与默认根域匹配。12份文件有CAT:Electronics,4份文件有CAT:Currency等。

[.]";方面";:{";计数";:32,";类别";:{";桶";:[{";val";:";Electronics";,";计数";:12},{";val";:";货币";,";计数";:4},{";val";:";内存";,";计数";:3},]}}

除了查询结果本身之外,Stat(也称为聚合或分析)方面对于显示从查询结果派生的信息很有用。例如,可以使用statfacet为电子商务站点上寻找内存的用户提供上下文。下面的例子计算了平均价格(和其他统计数据),并允许用户判断购物车中的记忆棒是否物美价廉。

最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";Memory";)。with Filter(";INSTOCK:TRUE";)。with StatFacet(";avg_price";,";avg(Price)";)。with StatFacet(";min_Manufacturing turedate_dt&34;,";min(Manufacturing_Dt)";)。with StatFacet(";Num_Supplier";,";Unique(Manu_Exact)";)。with StatFacet(";Medium_Weight";,";Percententile(Weight,50)";);QueryResponse queryResponse=请求。process(solrClient,Collection_name);

对上面的facet请求的响应将从匹配根域的文档开始(文档包含";memory";with INstock:true),然后是facets块中请求的统计信息:

";面";:{";计数";:4,";平均价格";:109.9950008392334,";供应商数量";:3,";中位数_权重";:352.0}。

";术语";和";范围&34;方面生成多个存储桶,并将域中的每个文档分配到这些存储桶中的一个(或多个)中。

";查询";和";热点图";方面始终生成域中所有文档所属的单个存储桶。

cURL http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";方面";:{类别:{";类型";:";术语";,";字段";:";CAT";,";限制";:5}。

Final TermsFactMap Category yFacet=new TermsFactMap(";cat";)。setLimit(5);最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。with Facet(";Categories";,Category yFacet);QueryResponse queryResponse=Request。process(solrClient,Collection_name);

“count”指定文档计数,“index”按存储桶值的索引(自然)顺序排序。还可以按存储桶中出现的任何面函数/统计信息排序。默认值为“count desc”。此参数也可以在JSON中指定,如排序:{COUNT:DESC}。排序顺序可以是“asc”或“desc”

超过分布式搜索期间从分片内部请求的限制的存储桶数。

较大的值可以提高当单个碎片具有非常不同的顶级术语时返回的最终顶级术语的准确性。

默认值-1会导致根据指定的其他选项应用大体。

如果为True,则启用分布式镶嵌面优化。这使用第二个阶段从未在其初始内部结果中包含这些存储桶的分片中检索最终结果所需的任何存储桶,以便每个分片都对此方面和任何子方面中返回的每个存储桶做出贡献。这使得返回的存储桶的计数&;统计准确。

确定要优化哪些存储桶时,在分布式搜索期间要内部考虑的超出限制的存储桶数。

较大的值可以提高当各个碎片具有非常不同的顶级术语时返回的最终顶级术语的准确性,并且当前排序选项可能会导致细化将术语向下推入排序列表(例如:Sort:";Count ASC&34;)(例如:Sort:";Count ASC&34;)。

默认值-1会导致根据指定的其他选项应用大体。

一个布尔值,指定是否应返回由字段中没有值的文档定义的特殊“缺失”存储桶。默认值为false。

布尔值。如果为true,则将“numBuckets”添加到响应中,这是一个整数,表示面的存储桶数(与返回的存储桶数相对)。默认值为false。

布尔值。如果为true,则向响应添加一个“allBuckets”存储桶,表示所有存储桶的并集。对于多值字段,这与域中所有文档的存储桶不同,因为单个文档可以属于多个存储桶。默认值为false。

一个可选参数,用于指定在初始收集顶部存储桶期间使用的最终排序的近似值(当排序参数非常昂贵时)。

查询方面生成与域和指定查询相匹配的单桶文档。

cURL http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";方面";:{";高_人气";:{";类型";:";查询";,";Q";:";人气:[8至10]";}}';

QueryFetMap queryFacet=new QueryFetMap(";Popular:[8 to 10]";);最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。with Facet(";High_Popular";,queryFacet);QueryResponse queryResponse=Request。process(solrClient,Collection_name);

curl http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";方面";:{";高_人气";:{";类型";:";查询";,";Q";:";人气:[8至10]";,";分面";:{";Average_Price";:";AVG(价格)";}';

QueryFtracMap queryFacet=new QueryFetMap(";Popular:[8 to 10]";)。with StatSubFacet(";Average_Price";,";avg(Price)";);最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。with Facet(";High_Popular";,queryFacet);QueryResponse queryResponse=Request。process(solrClient,Collection_name);

cURL http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";方面";:{";价格";:{";类型";:";范围";,";字段";:";价格";,";开始";:0,";结束";:100,";间隙";:20}';

RangeFaceMap rangeFacet=new RangeFetMap(";Price";,0.0,100.0,20.0);最终的JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。with Facet(";Price";,rangeFacet);QueryResponse queryResponse=Request。process(solrClient,Collection_name);

";价格";:{";Buckets";::[{";val";:0.0,//存储桶值代表每个范围的开始。此存储桶涵盖0-20";count";:5},{";val";:20.0,";count";:0},{";val";:0},{";val";:60.0,";count";:1},{";val";:80.0,";计数";:1}]}。

范围分面参数名称和语义在很大程度上反映了分面。范围查询-参数样式分面。例如,这里的";start";对应于facet.range命令中的";facet.range.start";。

一个布尔值,如果为真,则意味着最后一个存储桶将在“end”处结束,即使它小于“间隙”宽度也是如此。如果为False,则最后一个存储桶将是“间隙”宽的,可能会延伸到“End”之后。

此参数指示除了开始和结束之间的每个范围约束的计数外,还应计算…的计数。

";之后";字段值大于最后一个范围上限的所有记录

";介于";之间的所有记录,其字段值在所有范围的开始和结束边界之间。

默认情况下,用于计算开始和结束之间的范围镶嵌面的范围包括其下限,不包括上限。“之前”范围是排除的,“之后”范围是包含的。此缺省值相当于下面的";低";,不会导致边界重复计数。Include参数可以是以下选项的任意组合:

即使未指定相应的上/下选项,第一个和最后一个间隙范围也包括它们的边边界(即,第一个间隙范围的下限为第一个间隙范围的下限,最后一个间隙范围的上限为最后一个间隙范围的上限。

外部“之前”和“之后”范围将包含它们的边界,即使第一个或最后一个范围已经包括这些边界。

指定时的任意范围列表计算给定范围上的面,而不是开始、间隙和结束。对于开始、结束和间隙,范围或桶的宽度始终是固定的。如果需要在变化的范围宽度上计算范围刻面,则应指定范围。

当在Range方面中指定范围时,将忽略hardEnd、Include和其他参数。

任意范围由计算范围桶的From和To值组成。此范围可以用两种语法指定。

一个布尔值,如果为True,则表示包含FROM的下限。此默认值为true。

一个布尔值,如果为True,则表示包含的上限为。此默认值为False。

然后指定Range时,将忽略该范围中的所有上述参数From、To和ETC。

如果指定了Range,则会忽略其他参数,但有一些方法可以实现与Range相同的行为。

如果指定了Range,则忽略Include参数,但是有一些方法可以实现与Range相同的行为。使用INCLUSIVE_TO和INCLUSIVE_FROM的组合可以实现下、上、外、边全部。

cURL http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";方面";:{";价格";:{";类型";:";范围";,";字段";:";价格";,";范围";:[{";From";:0,";to";:20,";Include_From";:true,";Include_to";:false},{";range";:";[40,100)";}]}';

{";价格";:{";桶";:[{";val";:";[0,20)";,";count";:5},{";val";:";[40,100)";,";count";:2}]}}。

当指定Range时,其在请求中的值将用作响应中的键。在另一种情况下,使用FROM、TO、INCLUDE_TO和INCLUDE_FROM生成密钥。目前不支持自定义密钥。

热图分面为在每个网格单元中具有空间数据的文档生成分面计数的2D网格。

此功能主要记录在《参考指南》的空间一节中。关键参数是type以指定heatmap,而field以指示空间RPT字段。其余参数名称使用相同的名称和语义镜像方面。heatmap查询-参数样式方面,尽管没有";facet.heatmap。";前缀。例如,此处的geom对应于facet.heatmap命令中的facet.heatmap.geom。

与将域划分为存储桶的其他方面不同,热图方面目前不支持嵌套方面。

cURL http://localhost:8983/solr/spatialdata/query-d';{";查询";:";*:*";,";面";:{";位置";:{";类型";:";热点图";,";字段";:";LOCATION_SRPT";,";GEOM";:";[\";50 20\";到\";180 90\";]";,";gridLevel";:4}';

最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。setLimit(0)。使用Facet(";Locations";,new HeatmapFetMap(";location_srpt";))。setHeatmapFormat(HeatmapFaceMap.。HeatmapFormat。INTS2D)。setRegionQuery(";[\";50 20\";to\";180 90\";]";)。setGridLevel(4));

与到目前为止讨论的所有方面不同,聚合函数(也称为面函数、分析函数或度量)不会将数据划分为存储桶。取而代之的是,他们对域中的所有文档进行计算。

给定字段的唯一值数。如果超过100个值,则会产生不准确的估计。

与上面相同,但占用空间更小,严格用于计算Block Join块的数量。给定字段在块之间必须是唯一的,并且仅支持单值字符串字段,建议使用docValue。

通过t-digest算法进行百分位数估计。按此度量排序时,列出的第一个百分位数用作排序值。

用于计算域中的文档相对于背景集合(两者都被定义为查询)与前景集合的相关性分数的函数。这主要是在构建语义知识图时使用的。

诸如avg之类的数值聚合函数可以位于任何数值字段上,也可以位于多个数值字段的嵌套函数上,例如avg(div(Popular,Price))。

请求聚合函数的最常见方式是将其作为包含要计算的表达式的简单字符串:

curl http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";筛选器";:[";价格:[1.0to*]";,";人气:[0至10]";],";方面";:{";avg_value";:";avg(div(人气,价格))";}}';

最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。with Filter(";价格:[1.0至*]";)。with Filter(";人气:[0到10]";)。with StatFacet(";min_manu_id_s";,";min(Manu_Id_S)";)。with StatFacet(";avg_value";,";avg(div(人气,价格))";);QueryResponse queryResponse=请求。process(solrClient,Collection_name);

展开的表单允许指定本地参数。它们可以由一些专门的聚合(如relatedness())显式使用,但也可以用作参数引用,以使聚合表达式更具可读性,而不需要使用(全局)请求参数:

curl http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";筛选器";:[";价格:[1.0to*]";,";人气:[0至10]";],";方面";:{";avg_value";:{";类型";:";func";,";func";:";avg(div($numer,$denom))";,";numer";:";mul(Popular,3.0)";,";denom";:";Price";}}';

Final Map<;String,Object>;ExpandedStatFacet=new HashMap<;>;();expecdedStatFacet。放置(";type";,";func";);expecdedStatFacet。put(";func&34;,";avg(div($numer,$denom))";);expecdedStatFacet。put(";numer&34;,";mul(Popular,3.0)";);expecdedStatFacet。put(";denom";,";price";);最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。with Filter(";价格:[1.0至*]";)。with Filter(";人气:[0到10]";)。with Facet(";avg_value";,expenddedStatFacet);QueryResponse queryResponse=Request。process(solrClient,Collection_name);

嵌套的方面或子方面允许用户在将域划分为桶(即,术语、范围、查询)的任何方面命令下嵌套方面命令。然后,根据其父存储桶中的所有文档集合定义的域评估这些子方面。

语法与顶级facet相同-只需向父facet的facet命令块添加一个facet命令即可。从技术上讲,每个facet命令实际上都是一个子facet,因为我们从单个facet存储桶开始,其中包含由主查询和过滤器定义的域。

让我们从CATEGORY字段cat上的一个简单的非嵌套术语facet开始:

cURL http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";方面";:{";类别";:{";类型";:";术语";,";字段";:";CAT";,";限制";:3})';

Final TermsFactMap Category yFacet=new TermsFactMap(";cat";)。setLimit(3);最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。with Facet(";Categories";,Category yFacet);QueryResponse queryResponse=Request。process(solrClient,Collection_name);

上述方面的响应将显示顶级类别和落入每个类别存储桶中的文档数量。嵌套的方面可用于收集有关每个文档桶的附加信息。例如,使用下面的嵌套方面,我们可以找到排名靠前的类别以及每个类别中的主要制造商是谁:

cURL http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";方面";:{";类别";:{";类型";:";术语";,";字段";:";CAT";,";限制";:3,";方面";:{";TOP_MANUCTORIER";:{";类型";:";术语";,";字段";:";Manu_id_s";,";限制";:1};

Final TermsFactMap topCategoriesFacet=new TermsFactMap(";cat";)。setLimit(3);Final TermsFactMap topManufacturerFacet=new TermsFaceMap(";manu_id_s";)。setLimit(1);topCategoriesFacet.。with SubFacet(";TOP_MANAGERS";,topManufacturerFacet);最终JsonQueryRequest请求=new JsonQueryRequest()。setQuery(";*:*";)。with Facet(";Categories";,topCategoriesFacet);QueryResponse queryResponse=Request。process(solrClient,Collection_name);

";方面";:{";计数";:32,";类别";:{";存储桶";:[{";VAL";:";电子";,";计数";:12,";TOP_MANUCTORIER";:{";存储桶";:[{";val";:";Corsair";,";count";:3}]}},{";val";:";Currency";,";count";:4,";top_Manufacturer";:{";bucket";:[{";val";:";boa";,";count";:1}]}。

字段或术语方面的默认排序是按存储桶计数降序排序。我们可以选择按每个存储桶中出现的任何面函数进行升序或降序排序。

cURL http://localhost:8983/solr/techproducts/query-d';{";查询";:";*:*";,";方面";:{";类别";:{";类型";:";术语";,//术语方面为字段";字段";:";CAT";中的每个索引术语创建一个桶。,";限制";:3,";排序";:";平均价格说明";,";方面";:{";平均价格";:";平均(价格)";,}';

Final TermsFactMap topCategoriesFacet=new TermsFactMap(";cat";)。setLimit(3)。使用StatSU。

.