SOLR - 仅当匹配范围内的所有日期时匹配范围查询

时间:2012-04-05 01:54:04

标签: solr

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

我熟悉范围查询,但似乎SOLRs对数组的范围搜索工作方式与我想要的不同 - 只要数组中的任何项目匹配,则范围是匹配的)。我想向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]

这是可能的,还是我认为这一切都错了?

3 个答案:

答案 0 :(得分: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"

希望能回答你的问题!

答案 1 :(得分:0)

你有正确的想法,但是your initial query is a search instead of a 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查询)。如果是,则返回元素。如果没有,请不要。

从语法上讲,上述内容未经测试,可能无效。但从程序上讲,您应该能够根据自己的需要起草正确的查询。

Additional resource discussing the default AND behavior of composite search queries

答案 2 :(得分:0)

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

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

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

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

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

  4. 为您的最大值制定相同的内容
  5. 有关功能范围的参考 http://www.lucidimagination.com/blog/2009/07/06/ranges-over-functions-in-solr-14/