2 回答
![?](http://img1.sycdn.imooc.com/545869390001b87802200220-100-100.jpg)
TA贡献2041条经验 获得超4个赞
除非title
实际上是 multiValued - 你的帖子可以有多个标题 - 你应该在你的架构中定义它multiValued="false"
。但是,还有第二个问题——默认类型的字段text_general
不适合排序,因为它会生成多个标记,一个标记对应标题中的每个单词。这对于搜索很有用,但在排序时会给出奇怪且不直观的结果。
因此,改为定义一个title_sort
字段并使用带有 和 的字段类型KeywordTokenizer
(如果您想要不区分大小写的排序),或者如果您想要区分大小写的排序,请为该字段使用已经定义的字段类型。LowerCaseFilter
string
title_sort
![?](http://img1.sycdn.imooc.com/545868c20001b8c402200220-100-100.jpg)
TA贡献1828条经验 获得超3个赞
首先要检查的是您是否真的需要该标题字段是多值的,或者您的文档是否真的有多个标题?如果没有,您只需要通过设置来修复字段定义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 - 取决于字段定义 - 并且知道最大/最小函数应该只与数值一起使用),只是为了得到主意 :
# here the 2nd argument is a callback to max(), used precisely to get a single value from title
sort=field(title,max) asc
添加回答
举报