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

时间:2013-08-23 09:41:55

标签: 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><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)。

  • 问题1:我的solr文件应该如何?
  • 问题2:查询的外观如何?

1 个答案:

答案 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过滤结果


编辑:

有关qfq参数的更多信息:

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

  

我如何“根据不同的实体使用多个索引”?

查看多核功能:http://wiki.apache.org/solr/CoreAdmin

  

为每个可用日期保存是否过度:date; num_of_days_to_end_of_interval - 应该使查询更简单吗?

取决于您在这种情况下预期的数据量。我也不确定它会真正帮助你发布的查询。日期范围查询非常灵活和快速。你不需要避免它们。只需确保尽可能宽泛地指定允许缓存的时间。