Solr在排序中组合日期字段

时间:2015-10-08 14:08:49

标签: sorting solr

我们有一些文档在某些文档上使用日期d1编制索引,而在其他文档上使用d2,我们希望根据哪个文档可用,对它们进行排序。

sort=d1 desc, d2 desc

将使用d1单独为d2文档对文档进行排序,如下所示:

d1: 2014-03-12
d1: 2010-03-12
d2: 2013-03-12
d2: 2011-03-12

我们想要的是这样的一切:

d1: 2014-03-12
d2: 2013-03-12
d2: 2011-03-12
d1: 2010-03-12

遗憾的是,使用新的公共字段重新索引所有文档并不是一个选项。

6 个答案:

答案 0 :(得分:1)

据我所知,您可以使用solr的功能查询。对于这种类型,它就像那样

sort = if((abs(ms(d1,d2))> 0),d1,d2)desc

我还没有测试过,但这里有一个有用的链接可以解决你的问题。

https://wiki.apache.org/solr/FunctionQuery
Sort result by date difference

答案 1 :(得分:1)

Abdul使用function的方法是正确的方法。 但是阿卜杜勒的解决方案对我不起作用。

我已经成功测试了这个。

只需将此参数添加到您的查询中:

sort=max(d1,d2) desc

答案 2 :(得分:0)

也许您可以将d1和d2中的copyField添加到dAll,然后在dAll上进行排序?

您可以在此处查看copyField信息:https://cwiki.apache.org/confluence/display/solr/Copying+Fields

答案 3 :(得分:0)

正如this discussion中所述,您可以尝试使用ConcatFieldUpdateProcessorFactory更新您的数据:

<processor class="com.test.solr.update.CustomConcatFieldUpdateprocessorFactory">
  <str name="field">d1</str>
  <str name="field">d2</str>
  <str name="dest">date</str>
  <str name="delimiter"></str>
</processor>

之后,您可以尝试按字段日期排序。

答案 4 :(得分:0)

有两项建议,其中一项已经提出:

(1)使用copyField

<field name="d" type="date" indexed="true" stored="true" multiValued="false"/>    
<copyField source="d1" dest="d" />
<copyField source="d2" dest="d" />

即使d1d2字段很重要,您仍然可以将它们包含在查询中,但只需对合并的d字段进行排序。

(2)根据数据源的类型,您可以修改data-config.xml文件中的查询,将这两个字段合并为一个。在我们的环境中,我们使用Solr来索引来自MySQL实例的数据。很多时候,来自不同数据库的数据被整合到Solr中。这引入了类似的问题,我们需要规范化来自不同数据库的数据。在这些情况下,我们经常在查询中使用CASEIFNULL等结构。如果这适用于您的情况,我可以了解更多细节。

答案 5 :(得分:0)

我遇到了与你非常相似的问题。在我的情况下,所有文件都有&#34; d1&#34;和&#34; d2&#34;字段,所有字段都有&#34; d1&#34;值。 &#34; d2&#34; value用于覆盖&#34; d1&#34;值。

我的解决方案是:

sort=map(ms(d2),0,0,ms(d1)) desc

map(ms(d2),0,0,ms(d1))将返回&#34; d2&#34;时间戳如果不为空;如果是的话,&#34; d1&#34;改为使用时间戳

希望它有所帮助。