作为一般建议:尽可能预先计算,存储您正在查询的数据,而不是您获得的数据作为输入。
此外,使用基于不同实体的几个指标 - 如果你有自由这样做,如果查询将变得更加简单和直接。
好的,一般性抛开你的问题。
从你的例子,我认为你现在存储在索引如果顾问不可用 - 可能,因为这是你作为输入。但是你想要查询的是它们何时可用。所以,你应该考虑存储可用性,而不是不可用性。
编辑: 查询这个最直接的方法是使用间隔作为实体,这样你就不必诉诸特殊的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)的基本查询是用于间隔(使用q.alt在dismax处理程序的情况下):
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
难道是矫枉过正,以保存每个可用天:日期; num_of_days_to_end_of_interval - 应该让查询更简单?
取决于您在这种情况下需要多少数据。我也不确定它会真正帮助你发布你的查询。日期范围查询非常灵活和快速。你不需要避免它们。只要确保指定的时间尽可能宽,以允许缓存。
目前为止很好的回答。不幸的是,我对Solr很新颖(但是我有Lucene的经验)并且有一些初学者的问题:q和fq有什么区别?我怎样才能“基于不同的实体使用多个索引”?我通过节省可用时间与你在一起!保存每个可用的日期是否过分:date; num_of_days_to_end_of_interval - 应该使查询更简单? – Marcel
我已经编辑了答案以回应您的评论。 – Risadinha