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

Java 按Solr中多值字段的升序对搜索结果进行排序,java,maven,spring-mvc,solr,Java,Maven,Spring Mvc,Solr,我正在使用6.6.0版的Solr。我有一个标题(text\u-general)、描述(text\u-general)、id(integer)的模式。当我搜索关键字以按标题的升序列出结果时,我的代码返回一个错误无法对多值字段:title进行排序。 我尝试使用以下3种方法设置排序 SolrQuery query = new SolrQuery(); 1. query.setSort("title", SolrQuery.ORDER order); 2. query.addSort("title",

我正在使用6.6.0版的Solr。我有一个标题(text\u-general)、描述(text\u-general)、id(integer)的模式。当我搜索关键字以按标题的升序列出结果时,我的代码返回一个错误无法对多值字段:title进行排序。

我尝试使用以下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);
但所有这些都返回相同的错误

我通过参考这一点找到了解决办法

它说使用最小/最大函数。 query.setSort(字段(“页面标题”,min),ORDER.asc); 这就是我试图设置的查询,我不明白这里使用的参数是什么

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

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

org.apache.solr
索尔索尔
6.5.1

除非
标题实际上是多值的-你的文章可以有多个标题-你应该这样做。但是,还有第二个问题-默认类型的字段
text\u general
不适合排序,因为它将生成多个标记,标题中的每个单词对应一个标记。这对搜索很有用,但在排序时会给出奇怪的、非直观的结果


因此,相反,请定义一个
title\u sort
字段和and(如果需要不区分大小写的排序),或者如果需要区分大小写的排序,请使用已定义的
string
字段类型作为
title\u sort
字段,或者你的文档真的有多个标题?如果没有,您只需要通过设置
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中的任何一个来“获取”每个标题字段的单个值。您提到的答案是一个很好的例子,尽管它可能不适用于您(因为标题需要启用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

我建议在这个问题上添加
solr
标签,这样solr专家就会找到它。这与其说是关于
maven
spring mvc
,不如说是关于
solr
。我已经在我的模式中设置了
mulitvalued=“false”
,现在搜索开始了。但是排序不是按字母顺序的。不知何故,它返回的顺序如下
A&B宗教商店
A阵雨玫瑰宗教商店
丰富的恩典书籍和礼物
天使口音
紫色犰狳又一次,LLC
AGAPE基督教书籍和礼物。
我不明白这里的搜索顺序。即使来自Solr的直接搜索也以相同的顺序返回,这是因为您的字段仍然是
文本
字段,而不是
字符串
字段或仅附加了
关键字标记器
的字段类型。请参阅我答案中的第二段。还要注意,在大多数情况下(如本例),更改类型需要重新索引。感谢您的回答,最初,我在Solr模式中将标题字段定义为字符串变量。但是,它在索引数据时返回一个错误。我尝试过在模式中使用
String
Strings
,在这两种情况下,我的java代码都返回错误日志
“无法将DocValues类型从SORTED\u SET更改为SORTED for field“title”
,这就是我使用
text\u general
类型的原因。此外,只有
text\u general
type变量允许不区分大小写的搜索结果。该错误是由于更改了索引的现有字段的类型和现有数据引起的。在重新编制索引(并更改类型)之前,必须先清除索引。您可以使用不同类型的不同字段进行搜索和排序-因此,对于搜索,请使用带有
text\u general
的字段类型,但是对于排序,请使用带有
string
的字段类型(或者,如果您想要不区分大小写的排序,请使用带有
关键字标记器的
TextField
和附加的小写过滤器)。