Solr 6 DateRangeField搜索完全匹配

时间:2017-07-14 11:13:22

标签: solr date-range solr6

我有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不是可行的解决方案

任何人都可以帮助我找到一个可行而有效的解决方案。

1 个答案:

答案 0 :(得分:1)

您应该使用field查询解析器来指定函数(op)以将范围字段作为范围字段处理(标准查询解析器将DateRangeField视为{{1 }})。

可以将其指定为过滤查询TrieDateField(或使用fq={!field f=availableRange op=Contains}[2017-07-15 TO 2017-07-17]伪字段),其中_query_可以是opContains,{{1 }}。

默认行为为Intersects,因为您的特定情况Within似乎适合。