在Solr中以多值字段的升序对搜索结果进行排序

时间:2019-05-15 08:43:38

标签: java maven spring-mvc solr

我正在使用version 6.6.0的Solr。我有一个标题(text_general),描述(text_general),id(integer)的架构。当我搜索关键字以标题的升序列出结果时,我的代码返回错误无法对多值字段进行排序:标题。

我尝试使用以下3种方法设置排序

SolrQuery query = new SolrQuery();
1. query.setSort("title", SolrQuery.ORDER order);
2. query.addSort("title", SolrQuery.ORDER order);
3. SortClause ab = new SolrQuery.SortClause("title", SolrQuery.ORDER.asc);
   query.addSort(ab);

但是所有这些都返回相同的错误

我通过参考此answer

找到了解决方案

表示使用最小/最大功能。 query.setSort(field(“ pageTitle”,min),ORDER.asc); 这就是我要设置为查询的内容,我不明白这里使用的参数是什么。

这是我正在使用的Maven依赖项

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>6.5.1</version>
</dependency>

2 个答案:

答案 0 :(得分:2)

除非title实际上是多值的-您的帖子可以有多个标题-您应该define it as multiValued="false" in your schema。但是,还有第二个问题-默认类型text_general的字段不适合排序,因为它将生成多个令牌,标题中的每个单词一个。这对于搜索很有用,但在排序时会给出奇怪且不直观的结果。

因此,相反,定义一个title_sort字段以及use a field type with a KeywordTokenizerLowerCaseFilter attached(如果要区分大小写的排序),或者如果要区分大小写的排序,请使用已经定义的{{1 }}字段类型用于string

答案 1 :(得分:1)

首先要检查的是,您是否真的需要对标题字段进行多值处理,或者您的文档中确实有多个标题?如果没有,您只需要通过设置multivalued="false"来修复字段定义。

也就是说,对多值字段进行排序没有意义,除非确定应使用多个值中的哪一个进行排序,或者如何将它们组合为一个。

让我们说我们需要按标题(字母顺序)对给定的结果集进行排序,首先使用单值标题字段:

# Unsorted
"docs": [
  { "id": "1", "title": "One" },
  { "id": "2", "title": "Two" },
  { "id": "3", "title": "Three" },
]

# Sorted
"docs": [
  { "id": "1", "title": "One" },
  { "id": "3", "title": "Three" },
  { "id": "2", "title": "Two" },
]

# -> ok no problem here

现在不可能对多值字段应用相同的逻辑,因此,您必须确定要在每个文档中使用哪个标题才能对它们进行正确排序:

# Unorted
"docs": [
  { "id": "1", "title": ["One", "z-One", "a-One"] },
  { "id": "2", "title": ["Two", "z-Two", "a-Two"] },
  { "id": "3", "title": ["Three", "z-Three", "a-Three"] }
]

希望,Solr允许按函数的输出对结果进行排序,这意味着您可以使用Solr的function queries中的任何一个为每个标题字段“获取”单个值。即使您可能无法使用,您指的答案也是一个很好的例子(因为标题需要启用docValues-取决于字段定义-并且知道max / min函数应仅用于数字值),只是为了获得想法:

# here the 2nd argument is a callback to max(), used precisely to get a single value from title
sort=field(title,max) asc