solr:如何搜索至少有X天的日期范围?
给出:一份顾问名单,其中列出了不可用的时间间隔:solr:如何搜索至少有X天的日期范围?,solr,indexing,querying,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><
<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>
...
1.
2013-01-012013-01-10
2013-20-012013-01-30
...
...
我想寻找在从开始日期到结束日期的特定时间间隔内至少X天可用(!)的顾问
示例:向我展示2013-01-01-2013-02-01范围内至少5天可用的所有顾问(这将与顾问1匹配,因为他从2013-01-11到2013-01-19自由活动)
- 问题1:我的solr文档应该是什么样子
- 问题2:查询的外观如何
从您的示例中,我认为如果没有顾问,您当前会将其存储在索引中-可能是因为这是您作为输入得到的。但您要查询的是它们何时可用。因此,您应该考虑存储可用性,而不是不可用性 编辑: 查询这一点最直接的方法是将间隔用作实体,这样您就不必借助特殊的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" />
这是一个可选步骤。您可能希望对它是否提高查询性能进行基准测试。
此外,您还可以筛选某些顾问ID
(2.)基本查询是针对间隔的(如果是Demax处理程序,请使用q.alt):
(为了可读性增加了换行符,查询的两个组件应该用常规空格分隔)
确保始终将时间设置为相同的值。最好是00:00:00,因为这就是/DAY
所做的:。
不同的值越少,缓存效果越好
更多信息: -Solr范围查询 -缓存
fq
筛选结果
编辑: 有关
q
和fq
参数的更多信息:
在缓存方面,它们的处理方式不同。这就是为什么我首先添加了另一个链接(见上文)。对于您希望在查询中经常看到的筛选器,请使用fq
。您可以组合多个fq
参数,而每个请求只能指定q
一次
如何“基于不同实体使用多个索引”
查看多核功能:
为每一个可用的日子存钱是不是太过分了:日期;天数到时间间隔的结束-应该使查询更简单吗
这在一定程度上取决于您在这种情况下期望的数据量。我也不确定这对你发布的查询是否真的有帮助。日期范围查询非常灵活和快速。你不需要避开它们。只需确保指定尽可能宽的时间以允许缓存。到目前为止回答得很好。不幸的是,我对Solr非常陌生(但我有Lucene的经验),并且有一些初学者问题:q和fq之间有什么区别?如何“基于不同实体使用多个索引”?通过节省可用时间,我与您同在!为每一个可用的日子存钱是不是太过分了:日期;天数到时间间隔的结束-应该使查询更简单吗?
fq=interval_length:[5 to *]
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]