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

我正在使用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>


繁花不似锦
浏览 311回答 2
2回答

缥缈止盈

除非title实际上是 multiValued - 你的帖子可以有多个标题 - 你应该在你的架构中定义它multiValued="false"。但是,还有第二个问题——默认类型的字段text_general不适合排序,因为它会生成多个标记,一个标记对应标题中的每个单词。这对于搜索很有用,但在排序时会给出奇怪且不直观的结果。因此,改为定义一个title_sort字段并使用带有 和 的字段类型KeywordTokenizer(如果您想要不区分大小写的排序),或者如果您想要区分大小写的排序,请为该字段使用已经定义的字段类型。LowerCaseFilterstringtitle_sort

倚天杖

首先要检查的是您是否真的需要该标题字段是多值的,或者您的文档是否真的有多个标题?如果没有,您只需要通过设置来修复字段定义multivalued="false"。也就是说,除非确定应该使用这些多个值中的哪一个进行排序,或者如何将它们组合成一个,否则对多值字段进行排序是没有意义的。假设我们需要按标题(按字母顺序)对给定的结果集进行排序,首先使用单值标题字段:# Unsorted"docs": [&nbsp; { "id": "1", "title": "One" },&nbsp; { "id": "2", "title": "Two" },&nbsp; { "id": "3", "title": "Three" },]# Sorted"docs": [&nbsp; { "id": "1", "title": "One" },&nbsp; { "id": "3", "title": "Three" },&nbsp; { "id": "2", "title": "Two" },]# -> ok no problem here现在不可能像现在这样对多值字段应用相同的逻辑,您必须确定在每个文档中使用哪个标题才能正确排序它们:# Unorted"docs": [&nbsp; { "id": "1", "title": ["One", "z-One", "a-One"] },&nbsp; { "id": "2", "title": ["Two", "z-Two", "a-Two"] },&nbsp; { "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 titlesort=field(title,max) asc
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java