DSE Solr中的多个OR Frange

时间:2019-06-14 10:40:52

标签: solr cassandra datastax datastax-enterprise

我必须要约会,originalArrivalEta和realArrivalEta,并且我想根据这些日期之间的差异进行Solr搜索。

主要问题是我的时间范围不是连续的,而是被拼接的。因此,例如,我希望以后的日期和早些的日期都在3到5天之间。

我知道可以做到:

fq: {!frange l=-172800000 u=172800000 incu=true incl=true}ms(originalArrivalEta, realArrivalEta)

但是,由于fq始终是串联的,所以我不能这样做:

fq: {!frange l=-172800000 u=-86400000 incu=true incl=true}ms(originalArrivalEta, realArrivalEta)
fq: {!frange l=86400000 u=172800000 incu=true incl=true}ms(originalArrivalEta, realArrivalEta)

我还尝试通过基本上消除在我不感兴趣的范围中间的“空洞”来做一个纯粹的负数:

fq: {!frange l=-172800000 u=172800000 incu=true incl=true}ms(originalArrivalEta, realArrivalEta)
fq: -{!frange l=-86400000 u=86400000 incu=true incl=true}ms(originalArrivalEta, realArrivalEta)

我尝试过使用NOT和OR,但似乎都不起作用。

我还尝试通过定义fl来使用它:

fl: timediff:ms(originalArrivalEta, realArrivalEta)

但是我似乎无法对此进行过滤。而且我不确定我目前的技术堆栈是否仍允许我执行此操作,因为我当前正在使用使用Solr 6.0的Cassandra DSE 5.1引擎。

有没有一种方法可以使用多个未串联的frange? 有什么办法可以将它放在q中:

q: ( {!frange l=-172800000 u=-86400000 incu=true incl=true}ms(originalArrivalEta, realArrivalEta) OR {!frange l=86400000 u=172800000 incu=true incl=true}ms(originalArrivalEta, realArrivalEta) ) 

我知道性能可能会受到影响,但是如果没有其他方法可以做到,那么慢就总比没有好。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用_query_内联运行其他查询-可能会起作用。

但是,在这种情况下,您执行have the abs function,这将只允许您定义一个范围。

为了获得更好的性能,我建议也为该字段建立索引,并使用更新链填充它-这样,您可以使用任何查询语法而不必调用函数。