0

给定:顾问列表以及不可用时的间隔列表:

<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:查询的外观如何?
4

1 回答 1

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 *]

这是一个可选步骤。您可能想对它是否提高查询性能进行基准测试。此外,您还可以过滤某些顾问 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过滤器结果


编辑:

更多信息qfq参数:

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

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

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

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

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

于 2013-08-23T14:03:31.793 回答