2012-04-05 83 views
1

我正在使用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] 

这是可能的还是我对这一切都错了?

+1

[此](http://lucene.472066.n3.nabble.com/query-range-in-multivalued-date-field-td2361292.html)螺纹可能会帮助你。 – Noam 2012-04-08 12:57:35

回答

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"

希望这回答您的问题!

+0

对于大型日期范围,这不是一个易处理的解决方案。由于所有检查都是对数组中每个元素的范围查询进行评估,因此以这种方式构建查询将更有效。不过好的想法。 – MrGomez 2012-04-09 00:22:03

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

0

假设你正在从数据库中导入此数据。

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

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

  1. 查询的最大& min之间differnce不能大于差更大作为存储在索引

    匹配
  2. 你会确保{!FRANGE L = 0 U = difn_bet_query_max_and_min}子(FIELD_MIN,query_min)

  3. 制定的最高一回事值

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

+0

迷人的建议。如果我正确地阅读了这个内容,那么我们的想法是获取临时表并执行高通和低通滤波,然后查看结果数据表是否与最初给出的数据表相当。这是可行的,尽管它在存储和通行次数方面的内存和计算性能方面似乎不够优雅。思考? – MrGomez 2012-04-12 00:00:23

+0

仍然假设你从数据库导入。您不一定必须将销售人员日期的最小和最大值存储在分贝中,也可以将其存储在lucene/solr的索引中。通过在销售人员实体下创建另一个实体来创建另一个实体,并对当前正在处理的销售人员运行查询以查明该人员的最小和最大可用日期。还存储销售员的最大和最小日期之间的差异。对内存的要求与之前相同,但是执行更多的查询,因此速度更慢。但现在你不需要添加列到数据库。 – Joyce 2012-04-12 15:51:52

+0

我在这里提出了一个类似于这个问题的问题http://stackoverflow.com/questions/9892716/choose-solr-documents-where-one-field-is-great-than-another但实际上这个人的解决方案要求大于或小于被指数化为指数布尔值:(而不是试图计算瓦特/范围 – Joyce 2012-04-12 15:58:18