为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花不似锦 2022-11-30 11:18:31
我正在使用version 6.6.0. 我有一个标题(text_general)、描述(text_general)、id(整数)的模式。当我搜索关键字以按标题的升序列出结果时,我的代码返回错误无法在多值字段上排序:标题。我尝试使用以下 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(field("pageTitle",min), ORDER.asc); 这是我要设置为查询的内容,我不明白这里使用的参数是什么。这是我正在使用的 Maven 依赖项<dependency>    <groupId>org.apache.solr</groupId>    <artifactId>solr-solrj</artifactId>    <version>6.5.1</version></dependency>
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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

因此,改为定义一个title_sort字段并使用带有 和 的字段类型KeywordTokenizer(如果您想要不区分大小写的排序),或者如果您想要区分大小写的排序,请为该字段使用已经定义的字段类型。LowerCaseFilterstringtitle_sort


查看完整回答
反对 回复 2022-11-30
?
倚天杖

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


查看完整回答
反对 回复 2022-11-30
  • 2 回答
  • 0 关注
  • 299 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信