我有salesperson
索引,其availableDateRange
为多值dateRangeField。
以下是availableDateRange
字段
<fields>
<field name="availableDateRange" type="daterange" indexed="true" stored="true" multiValued="true" required="false"/>
</fields>
<types>
<fieldtype name="daterange" class="solr.DateRangeField"/>
</types>
如果我从2017-07-15到207-07-17搜索可用的销售人员,如下所示
avalableRange:"[2017-07-15 TO 2017-07-17]"
在搜索结果中我得到2个结果如下:
availableRange: [
"[2017-01-01T00:00:00Z TO 2017-07-15T00:00:00Z]",
"[2017-09-01T00:00:00Z TO 2017-12-31T00:00:00Z]"
]
availableRange: [
"[2017-07-17T00:00:00Z TO 2017-07-19T00:00:00Z]"
]
目前正在搜索dateRange [2017-07-15至2017-07-17]向我展示的销售人员在15日至17日期间的任何一个匹配日均可使用。
当前查询的行为类似于
availableRange:"2017-07-15" OR availableRange:"2017-07-16" OR availableRange:"2017-07-17"
我的问题是:如何让搜索范围内所有日期都可用的所有销售人员(即上述日期范围为15,16,17 7月的所有日期)
查询的行为类似于:
availableRange:"2017-07-15" AND availableRange:"2017-07-16" AND availableRange:"2017-07-17"
但对于大日期范围(例如2017-01-01至2017-12-31),使用AND不是可行的解决方案
任何人都可以帮助我找到一个可行而有效的解决方案。
答案 0 :(得分:1)
您应该使用field
查询解析器来指定函数(op
)以将范围字段作为范围字段处理(标准查询解析器将DateRangeField
视为{{1 }})。
可以将其指定为过滤查询TrieDateField
(或使用fq={!field f=availableRange op=Contains}[2017-07-15 TO 2017-07-17]
伪字段),其中_query_
可以是op
,Contains
,{{1 }}。
默认行为为Intersects
,因为您的特定情况Within
似乎适合。