在Solr中,我可以对多值字段中的匹配值进行排序吗?

时间:2013-12-27 19:51:40

标签: sorting solr multivalue

我们正在考虑具有两个多值字段的模式。搜索在第一个字段上执行,但应使用相应的值在第二个字段上进行排序。例如。如果文档由于第一个字段中的第n个值匹配(其中n对于每个匹配可能不同),那么它们应该按第二个字段中的第n个值排序。

这可能吗?

背景:每个文档都有一个类似文档列表(ID)和相应的相似性得分列表(0到1之间的值)。鉴于ID 42,我们需要返回所有类似的文档(例如,在第一个字段中包含42个文档),按照它们与文档42的相似性排序。

我们正在考虑的其他架构是:

  1. 每个ID的动态字段,以便我们可以在搜索类似于42的文档时按字段Similarity_ID42进行排序。这似乎无法扩展,在800K +文档时,CPU在索引编制期间会达到100%。
  2. 单个多值字段,存储“ID.score”作为小数(例如42.563),然后搜索具有值>的所有文档。 42 AND< 43,并按该值排序(我甚至不确定这是可能的)。

1 个答案:

答案 0 :(得分:3)

该方法不会成功,因为您可以搜索,但不能按多值字段排序。这在Sorting with Multivalued Field in Solrwritten in Solr's Wiki

中指出
  

可以对文档的“得分”进行排序,也可以对任何multiValued =“false”indexed =“true”字段进行排序,前提是该字段是非标记化的(即:没有分析器)或使用分析器只产生一个Term(即:使用KeywordTokenizer)

<强>更新

关于备选方案,当您指出需要为一个给定ID找到类似的文档时,为什么不创建一个具有类似

的架构的第二个核心
<fields>
    <field name="doc_id" type="int" indexed="true" stored="true" />
    <field name="similar_to_id" type="int" indexed="true" stored="true" />
    <field name="similarity" type="string" indexed="true" stored="true" />
</fields>

<types>
    <fieldType name="int" class="solr.TrieIntField"/>
    <fieldType name="string" class="solr.StrField" />
</types>

然后,您可以在执行实际搜索后执行第二次查询

  

Q = similar_to_id = 42&安培;排序=相似性