2013-08-23 47 views
0

考虑:顾问的名单有间隔的名单时,他们没有可供选择:solr:如何用至少X天搜索日期范围?

<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> 
... 

我想寻找可供至少在X天从一个特定的时间间隔顾问(!) STARTDATE到ENDDATE。

例如:显示可用于在2013-01-01的范围内至少5天所有顾问 - 2013年2月1日(因为他是免费的,从2013年1月11日到2013年这将匹配顾问1 -01-19)。

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

回答

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)的基本查询是用于间隔(使用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过滤器的缓存结果


编辑:

qfq参数

更多信息:

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

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

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

难道是矫枉过正,以保存每个可用天:日期; num_of_days_to_end_of_interval - 应该让查询更简单?

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

+0

目前为止很好的回答。不幸的是,我对Solr很新颖(但是我有Lucene的经验)并且有一些初学者的问题:q和fq有什么区别?我怎样才能“基于不同的实体使用多个索引”?我通过节省可用时间与你在一起!保存每个可用的日期是否过分:date; num_of_days_to_end_of_interval - 应该使查询更简单? – Marcel

+0

我已经编辑了答案以回应您的评论。 – Risadinha