鉴于:一份顾问名单,列出了不可用的时间间隔列表:
<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>
...
我想在从STARTDATE到ENDDATE的特定时间间隔内搜索可用(!)至少X天的顾问。
示例:向我展示2013-01-01 - 2013-02-01范围内至少可以使用5天的所有顾问(这将与顾问1匹配,因为他在2013-01-11至2013年期间免费 - 01-19)。
答案 0 :(得分:1)
作为一般建议:尽可能预先计算,存储您查询的数据,而不是输入的数据。
此外,使用基于不同实体的多个索引 - 如果您可以自由地执行此操作,并且查询将变得更简单,更直接。
好的,除了你的问题以外的一般性。
从你的例子中我认为,如果顾问不可用,你当前存储在索引中 - 可能,因为这是你得到的输入。但是你想要查询的是它们何时可用。因此,您应该考虑存储可用性而不是不可用性。
编辑: 查询此问题的最直接方法是将间隔用作实体,这样您就不必使用特殊的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" />
您的查询:
(1。)(可选)检索至少具有所请求长度的所有间隔:
fq=interval_length:[5 to *]
这是一个可选步骤。您可能希望对其是否提高查询性能进行基准测试。 此外,您还可以过滤某些consultant_ids。
(2。)基本查询是针对间隔的(在dismax处理程序的情况下使用q.alt):
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]
(为了便于阅读添加了换行符,查询的两个组件应该用常规空格分隔)
确保始终将时间设置为相同的值。最好是00:00:00,因为这是/DAY
所做的:http://lucene.apache.org/solr/4_4_0/solr-core/org/apache/solr/util/DateMathParser.html。
值越小,缓存越好。
更多信息:
http://wiki.apache.org/solr/SolrQuerySyntax - Solr范围查询
http://wiki.apache.org/solr/SolrCaching#filterCache - 缓存fq
过滤结果
编辑:
有关q
和fq
参数的更多信息:
http://wiki.apache.org/solr/CommonQueryParameters
在缓存方面,它们的处理方式不同。这就是为什么我首先添加了另一个链接(见上文)。对于您希望在查询中经常看到的过滤器,请使用fq
。您可以组合多个fq
参数,而每个请求只能指定一次q
。
我如何“根据不同的实体使用多个索引”?
查看多核功能:http://wiki.apache.org/solr/CoreAdmin
为每个可用日期保存是否过度:date; num_of_days_to_end_of_interval - 应该使查询更简单吗?
取决于您在这种情况下预期的数据量。我也不确定它会真正帮助你发布的查询。日期范围查询非常灵活和快速。你不需要避免它们。只需确保尽可能宽泛地指定允许缓存的时间。