我正在使用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>
答案 0 :(得分:2)
除非title
实际上是多值的-您的帖子可以有多个标题-您应该define it as multiValued="false"
in your schema。但是,还有第二个问题-默认类型text_general
的字段不适合排序,因为它将生成多个令牌,标题中的每个单词一个。这对于搜索很有用,但在排序时会给出奇怪且不直观的结果。
因此,相反,定义一个title_sort
字段以及use a field type with a KeywordTokenizer
和LowerCaseFilter
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