DSE Solr 中的多个 OR 范围

Posted

技术标签:

【中文标题】DSE Solr 中的多个 OR 范围【英文标题】:Multiple OR frange in DSE Solr 【发布时间】:2019-10-28 23:49:13 【问题描述】:

我有日期,originalArrivalEta 和 realArrivalEta,我想根据这些日期之间的差异进行 Solr 搜索。

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

我知道可以:

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

但是,由于 fq 总是连接我不能这样做:

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

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

fq: !frange l=-172800000 u=172800000 incu=true incl=truems(originalArrivalEta, realArrivalEta)
fq: -!frange l=-86400000 u=86400000 incu=true incl=truems(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=truems(originalArrivalEta, realArrivalEta) OR !frange l=86400000 u=172800000 incu=true incl=truems(originalArrivalEta, realArrivalEta) ) 

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

感谢您的帮助!

【问题讨论】:

你can use _query_ to run other queries inline - 也许这会起作用?您还有the abs function,它只允许您定义一个范围。为了获得更好的性能,我建议也对该字段进行索引,并使用更新链填充它 - 这样您就可以使用任何查询语法而无需调用函数。 腹肌!当然,这么简单优雅的答案,谢谢! 【参考方案1】:

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

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

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

【讨论】:

以上是关于DSE Solr 中的多个 OR 范围的主要内容,如果未能解决你的问题,请参考以下文章

在 SolR 中创建搜索索引时出错 - Cassandra 集成 (DSE)

如何对 Solr 中的多个字段执行嵌套聚合?

Cassandra SOLR 滚动升级

将一个字段转换为Solr中的多个字段

卢克与 datastax solr

在 datastax 图中使用 gremlin 访问 Solr 的最佳方法