1

我有作为多值 dateRangeField的salesperson索引。availableDateRange以下是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 TO 2017-07-17] 显示的销售人员甚至在 7 月 15 日至 7 月 17 日的任何一个匹配日都有空。

当前查询的行为类似于

availableRange:"2017-07-15" OR availableRange:"2017-07-16" OR availableRange:"2017-07-17"

我的问题是:我怎样才能获得在搜索范围的所有日子里都有空的所有销售人员(即提到的日期范围 7 月 15、16、17 日的所有日子)

查询的行为应该类似于:

availableRange:"2017-07-15" AND availableRange:"2017-07-16" AND availableRange:"2017-07-17"

但是对于大日期范围(例如 2017-01-01 TO 2017-12-31),使用 AND 不是一个可行的解决方案

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

4

1 回答 1

1

您应该使用field查询解析器指定函数 ( op) 将范围字段作为范围字段处理(标准查询解析器认为DateRangeField是 的直接替换TrieDateField)。

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

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

于 2017-07-14T12:33:16.600 回答