我们有一些文档在某些文档上使用日期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
遗憾的是,使用新的公共字段重新索引所有文档并不是一个选项。
答案 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)
答案 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" />
即使d1
和d2
字段很重要,您仍然可以将它们包含在查询中,但只需对合并的d
字段进行排序。
(2)根据数据源的类型,您可以修改data-config.xml
文件中的查询,将这两个字段合并为一个。在我们的环境中,我们使用Solr来索引来自MySQL实例的数据。很多时候,来自不同数据库的数据被整合到Solr中。这引入了类似的问题,我们需要规范化来自不同数据库的数据。在这些情况下,我们经常在查询中使用CASE
或IFNULL
等结构。如果这适用于您的情况,我可以了解更多细节。
答案 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;改为使用时间戳
希望它有所帮助。