作为一般建议:尽可能多地预先计算,存储您正在查询的数据,而不是您作为输入获得的数据。
此外,使用基于不同实体的多个索引 - 如果您有权这样做,并且查询会变得更简单和更直接。
好的,抛开一般性,继续你的问题。
从您的示例中,如果没有顾问,我认为您当前存储在索引中 - 可能是因为这是您作为输入得到的。但是您要查询的是它们何时可用。因此,您应该考虑存储可用性而不是不可用性。
编辑:查询这个最先进的方法是将间隔用作实体,这样您就不必求助于特殊的 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 *]
这是一个可选步骤。您可能想对它是否提高查询性能进行基准测试。此外,您还可以过滤某些顾问 ID。
(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 - 应该使查询更简单吗?
取决于在这种情况下您期望的更多数据。我也不确定它是否真的会对您发布的查询有所帮助。日期范围查询非常灵活和快速。你不需要避免它们。只要确保您指定的时间尽可能宽,以允许缓存。