1

我正在使用 SOLR 并存储销售人员可以访问客户的日期数组(旅行可以持续一天以上,具体取决于客户的要求)。对于每个销售人员,我都有一个给定月份可供销售人员使用的日期列表。还有其他字段,包括销售人员数据、地理位置信息等。

我熟悉范围查询,但似乎 SOLR 对数组的范围搜索的工作方式与我想要的不同——只要数组中的任何项目都是匹配的,那么范围就是匹配的)。我想向 SOLR 发送一个带有范围的查询,并且只有在数组中找到该范围内的所有日期时才返回匹配项。例如:

<arr name="available_dates">
    <date>2012-04-30T00:00:00Z</date>
    <date>2012-05-01T00:00:00Z</date>
    <date>2012-05-02T00:00:00Z</date>
</arr>

-- should match --
available_dates:[2012-04-30T00:00:00.000Z TO 2012-05-02T00:00:00.000Z]

-- should not match as 2012-04-29 is not contained in available_dates --
available_dates:[2012-04-29T00:00:00.000Z TO 2012-05-02T00:00:00.000Z]

这是可能的还是我做错了?

4

3 回答 3

0

您有正确的想法,但您的初始查询是search而不是match。直观地说,您的搜索应该available_dates:[2012-04-30T00:00:00.000Z TO 2012-05-02T00:00:00.000Z]包含 的所有元素available_dates才能成功匹配

您有两个选项可以有效且成功地实现此逻辑。您可以手动或动态地对数组中的每个元素执行范围查询,也可以设置一个辅助功能,在执行搜索后尝试执行匹配。例如:

available_dates:[2012-04-30T00:00:00.000Z TO 2012-05-02T00:00:00.000Z](available_dates)

也就是说,按从左到右的顺序:评估范围搜索,然后检查所有结果available_dates是否包含在此评估中(通过默认AND查询)。如果是,则返回元素。如果没有,不要。

从语法上讲,上述内容未经测试,可能不起作用。但在程序上,您应该能够围绕此起草正确的查询以满足您的需求。

讨论复合搜索查询的默认AND行为的附加资源)

于 2012-04-09T01:00:20.923 回答
0

假设您要从数据库中导入此数据。

在您的数据库或搜索索引中,创建一个新列来存储销售人员日期的最大值(如最新日期)以及最小值。此外,计算并存储最大和最小日期之间的差异。

匹配查询必须匹配三个条件(因此在查询中使用 AND)

  1. 查询的最大值和最小值之间的差异不能大于存储在索引中的差异

  2. 你要确保 {!frange l=0 u=difn_bet_query_max_and_min}sub(field_min,query_min)

  3. 为你的最大值制定同样的事情

有关功能范围的参考 http://www.lucidimagination.com/blog/2009/07/06/ranges-over-functions-in-solr-14/

于 2012-04-10T17:44:20.277 回答
0

您应该使用多个子句,而不是使用范围查询,每个日期一个子句。

所以而不是available_dates:[2012-04-29T00:00:00.000Z TO 2012-05-02T00:00:00.000Z]

你应该使用available_dates:"2012-04-29T00:00:00.000Z" AND available_dates:"2012-04-30T00:00:00Z" AND available_dates:"2012-05-01T00:00:00.000Z" AND available_dates:"2012-05-02T00:00:00.000Z"

希望这能回答你的问题!

于 2012-04-07T09:39:58.647 回答