solr:如何搜索至少有X天的日期范围?

solr:如何搜索至少有X天的日期范围?,solr,indexing,querying,Solr,Indexing,Querying,给出:一份顾问名单,其中列出了不可用的时间间隔: <consultant> <id>1</id> <not-available> <interval><from>2013-01-01</from><to>2013-01-10</to> <interval><from>2013-20-01</from><

给出:一份顾问名单,其中列出了不可用的时间间隔:

<consultant>
    <id>1</id>
    <not-available>
        <interval><from>2013-01-01</from><to>2013-01-10</to>
        <interval><from>2013-20-01</from><to>2013-01-30</to>
        ...
    </not-available>
</consultant>
...

1.
2013-01-012013-01-10
2013-20-012013-01-30
...
...
我想寻找在从开始日期到结束日期的特定时间间隔内至少X天可用(!)的顾问

示例:向我展示2013-01-01-2013-02-01范围内至少5天可用的所有顾问(这将与顾问1匹配,因为他从2013-01-11到2013-01-19自由活动)

  • 问题1:我的solr文档应该是什么样子
  • 问题2:查询的外观如何

作为一般建议:尽可能多地预计算,存储您正在查询的数据,而不是作为输入获取的数据

此外,如果您可以自由地使用基于不同实体的多个索引,并且查询会变得更简单、更直接,那么也可以使用这些索引

好的,把你的问题的概括性放在一边


从您的示例中,我认为如果没有顾问,您当前会将其存储在索引中-可能是因为这是您作为输入得到的。但您要查询的是它们何时可用。因此,您应该考虑存储可用性,而不是不可用性

编辑: 查询这一点最直接的方法是将间隔用作实体,这样您就不必借助特殊的SOLR功能来查询两个多值字段上间隔的开始和结束

存储可用性间隔后,还可以预先计算并存储其长度:

<!-- id of the interval -->
<field name="id" type="int" indexed="true" stored="true" multiValued="false" />
<field name="consultant_id" type="int" indexed="true" stored="true" multiValued="false" />
<!-- make sure that the time is set to 00:00:00 (*/DAY) -->
<field name="interval_start" type="date" indexed="true" stored="true" multiValued="false" />
<!-- make sure that the time is set to 00:00:00 (*/DAY) -->
<field name="interval_end" type="date" indexed="true" stored="true" multiValued="false" />
<field name="interval_length" type="int" indexed="true" stored="true" multiValued="false" />
这是一个可选步骤。您可能希望对它是否提高查询性能进行基准测试。 此外,您还可以筛选某些顾问ID

(2.)基本查询是针对间隔的(如果是Demax处理程序,请使用q.alt):

(为了可读性增加了换行符,查询的两个组件应该用常规空格分隔)

确保始终将时间设置为相同的值。最好是00:00:00,因为这就是
/DAY
所做的:。 不同的值越少,缓存效果越好


更多信息: -Solr范围查询 -缓存
fq
筛选结果


编辑:

有关
q
fq
参数的更多信息:

在缓存方面,它们的处理方式不同。这就是为什么我首先添加了另一个链接(见上文)。对于您希望在查询中经常看到的筛选器,请使用
fq
。您可以组合多个
fq
参数,而每个请求只能指定
q
一次

如何“基于不同实体使用多个索引”

查看多核功能:

为每一个可用的日子存钱是不是太过分了:日期;天数到时间间隔的结束-应该使查询更简单吗


这在一定程度上取决于您在这种情况下期望的数据量。我也不确定这对你发布的查询是否真的有帮助。日期范围查询非常灵活和快速。你不需要避开它们。只需确保指定尽可能宽的时间以允许缓存。

到目前为止回答得很好。不幸的是,我对Solr非常陌生(但我有Lucene的经验),并且有一些初学者问题:q和fq之间有什么区别?如何“基于不同实体使用多个索引”?通过节省可用时间,我与您同在!为每一个可用的日子存钱是不是太过分了:日期;天数到时间间隔的结束-应该使查询更简单吗?
fq=interval_length:[5 to *]
q=interval_start:[2013-01-01T00:00:00.000Z TO 2013-02-01T00:00:00.000Z-5DAYS]
  interval_end:[2013-01-01T00:00:00.000Z+5DAYS TO 2013-02-01T00:00:00.000Z]