DSE Solr 中的多个或范围

Multiple OR frange in DSE Solr

我需要日期,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)

我也试图通过基本上尝试删除我不感兴趣的范围中间的 "hole" 来做一个纯粹的否定:

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)

但我似乎无法通过它进行过滤。而且我不确定我当前的技术堆栈是否允许我这样做,因为我目前使用的是 Cassandra DSE 5.1 引擎,它使用 Solr 6.0。

有没有办法使用多个未连接的 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) ) 

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

感谢您的帮助!

您可以使用 _query_ 到 运行 其他内联查询 - 这可行。

在这种情况下,您可以 have the abs function,这将允许您只定义一个范围。

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