我正在使用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]
这是可能的,还是我认为这一切都错了?
答案 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)
查询的最大值和最大值之间的差异min不能大于存储在索引
你要确保{!frange l = 0 u = difn_bet_query_max_and_min} sub(field_min,query_min)
有关功能范围的参考 http://www.lucidimagination.com/blog/2009/07/06/ranges-over-functions-in-solr-14/