结合日期范围分面和数据透视分面的 Solr 查询
Solr query to combine date range faceting and pivot faceting
这个问题是关于:
在我的架构中,我有一个名为 dateRange
的 DateRangeField,就像在另一个问题中提到的那样。
我可以使用此字段对此字段进行范围方面查询:
/select
?wt=json
&q=*:*
&facet=true
&facet.range=dateRange
&facet.range.start=NOW/DAY-30DAYS
&facet.range.end=NOW/DAY%2B1DAYS
&facet.range.gap=%2B1DAY
&rows=0
现在我有另一个名为 interests
的字符串多值字段,我想在其上进一步存储日期方面。这是一个示例文档:
{
"id": "3",
"dateRange": "[2017-12-08T00:00:00Z TO 2017-12-10T03:45:55.567Z]",
"interests": ["hockey", "soccer"]
}
所以我想将 pivot faceting 与我在上面执行的范围分面查询结合起来。有办法吗?
作为替代方案,我考虑了 JSON faceting 路线。但我什至无法使日期范围查询正常工作。这是查询:
curl http://localhost:8983/solr/gs2/query -d 'q=*:*&rows=0&
json.facet={
dates_f : {
type : range,
field : dateRange,
start : "2017-12-01T00:00:00Z",
end : "2017-12-14T00:00:00Z",
gap : "%2B1DAY"
}
}
'
这会引发以下错误:
{
"responseHeader":{
"zkConnected":true,
"status":400,
"QTime":55,
"params":{
"q":"*:*",
"json.facet":"{ \n dates_f : { \n type : range, \n field : dateRange, \n start : \"2017-12-01T00:00:00Z\",\n end : \"2017-12-14T00:00:00Z\", \n gap : \"+1DAY\"\n } \n} \n",
"rows":"0"}},
"error":{
"metadata":[
"error-class","org.apache.solr.common.SolrException",
"root-error-class","org.apache.solr.common.SolrException",
"error-class","org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException",
"root-error-class","org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException"],
"msg":"Error from server at http://xxx.xx.xx.xx:7574/solr/gs2_shard2_replica1: Unable to range facet on field:dateRange{type=date_range,properties=indexed,stored,omitTermFreqAndPositions,useDocValuesAsStored}",
"code":400}}
不确定为什么 Solr 不能在 DateRangeField 上范围分面。
对于这个用例,我没有尝试 JSON 分面 API,但是您可以通过添加 1 个参数很容易地组合枢轴分面和范围分面:
facet.pivot={!range=r1}interests
并将 facet.range
参数替换为:{!tag=r1}dateRange
枢轴分面支持与范围分面结合,使用local parameter reference。
你会得到这样的结果:
cricket 2
dateRange
2017-12-01T00:00:00Z
0
2017-12-02T00:00:00Z
2
2017-12-03T00:00:00Z
2
2017-12-04T00:00:00Z
1
2017-12-05T00:00:00Z
1
hockey 2
dateRange
2017-12-01T00:00:00Z
1
2017-12-02T00:00:00Z
2
2017-12-03T00:00:00Z
2
2017-12-04T00:00:00Z
1
2017-12-05T00:00:00Z
1
像往常一样,完整示例位于 there
这个问题是关于:
在我的架构中,我有一个名为 dateRange
的 DateRangeField,就像在另一个问题中提到的那样。
我可以使用此字段对此字段进行范围方面查询:
/select
?wt=json
&q=*:*
&facet=true
&facet.range=dateRange
&facet.range.start=NOW/DAY-30DAYS
&facet.range.end=NOW/DAY%2B1DAYS
&facet.range.gap=%2B1DAY
&rows=0
现在我有另一个名为 interests
的字符串多值字段,我想在其上进一步存储日期方面。这是一个示例文档:
{
"id": "3",
"dateRange": "[2017-12-08T00:00:00Z TO 2017-12-10T03:45:55.567Z]",
"interests": ["hockey", "soccer"]
}
所以我想将 pivot faceting 与我在上面执行的范围分面查询结合起来。有办法吗?
作为替代方案,我考虑了 JSON faceting 路线。但我什至无法使日期范围查询正常工作。这是查询:
curl http://localhost:8983/solr/gs2/query -d 'q=*:*&rows=0&
json.facet={
dates_f : {
type : range,
field : dateRange,
start : "2017-12-01T00:00:00Z",
end : "2017-12-14T00:00:00Z",
gap : "%2B1DAY"
}
}
'
这会引发以下错误:
{
"responseHeader":{
"zkConnected":true,
"status":400,
"QTime":55,
"params":{
"q":"*:*",
"json.facet":"{ \n dates_f : { \n type : range, \n field : dateRange, \n start : \"2017-12-01T00:00:00Z\",\n end : \"2017-12-14T00:00:00Z\", \n gap : \"+1DAY\"\n } \n} \n",
"rows":"0"}},
"error":{
"metadata":[
"error-class","org.apache.solr.common.SolrException",
"root-error-class","org.apache.solr.common.SolrException",
"error-class","org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException",
"root-error-class","org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException"],
"msg":"Error from server at http://xxx.xx.xx.xx:7574/solr/gs2_shard2_replica1: Unable to range facet on field:dateRange{type=date_range,properties=indexed,stored,omitTermFreqAndPositions,useDocValuesAsStored}",
"code":400}}
不确定为什么 Solr 不能在 DateRangeField 上范围分面。
对于这个用例,我没有尝试 JSON 分面 API,但是您可以通过添加 1 个参数很容易地组合枢轴分面和范围分面:
facet.pivot={!range=r1}interests
并将 facet.range
参数替换为:{!tag=r1}dateRange
枢轴分面支持与范围分面结合,使用local parameter reference。
你会得到这样的结果:
cricket 2
dateRange
2017-12-01T00:00:00Z
0
2017-12-02T00:00:00Z
2
2017-12-03T00:00:00Z
2
2017-12-04T00:00:00Z
1
2017-12-05T00:00:00Z
1
hockey 2
dateRange
2017-12-01T00:00:00Z
1
2017-12-02T00:00:00Z
2
2017-12-03T00:00:00Z
2
2017-12-04T00:00:00Z
1
2017-12-05T00:00:00Z
1
像往常一样,完整示例位于 there