javascript
Spring Data Solr教程:排序
當我們實現單詞搜索功能時,我們通常希望通過使用每個搜索結果的相關性以降序對搜索結果進行排序。 這也是Solr的默認行為。
但是,在某些情況下,有必要手動指定排序順序。 一種此類情況是“常規”搜索功能的實現,該功能已在我的Spring Data Solr教程的上一部分中進行了討論。
這篇博客文章描述了如何使用Spring Data Solr對查詢結果進行排序。 更具體地說,我們必須修改示例應用程序的搜索功能,以通過使用id字段的值將搜索結果降序排列。
此博客文章分為三個部分:
- 第一部分描述了如何指定查詢中使用的排序選項。
 - 第二部分描述了在使用查詢方法構建查詢時如何對查詢結果進行排序。
 - 第三部分教我們如何對動態查詢的查詢結果進行排序。
 
讓我們開始吧。
注意:這些博客文章提供了其他信息,可幫助我們理解此博客文章中描述的概念:
- 使用Maven運行Solr
 - Spring Data Solr教程:Solr簡介
 - Spring Data Solr教程:配置
 - Spring Data Solr教程CRUD(幾乎)
 - Spring Data Solr教程:將自定義方法添加到單個存儲庫
 - Spring Data Solr教程:動態查詢
 
指定查詢的排序選項
查詢的排序選項是使用Sort類指定的。 下面給出了對查詢結果進行排序的典型要求:
- 通過使用單個字段的值對查詢結果進行排序。
 - 當不同字段的排序順序相同時,通過使用多個字段的值對查詢結果進行排序。
 - 當不同字段的排序順序不同時,通過使用多個字段的值對查詢結果進行排序。
 
讓我們看一下如何創建一個滿足給定要求的Sort對象。
首先,我們必須創建一個Sort對象,該對象指定使用單個字段對查詢結果進行排序。 假設我們要使用id字段按升序對查詢結果進行排序。 我們可以使用以下代碼創建Sort對象:
new Sort(Sort.Direction.ASC, "id")其次,我們必須創建一個Sort對象,該對象聲明當不同字段的排序順序相同時,使用多個字段的值對查詢結果進行排序。 假設我們必須使用id和description字段對查詢結果進行降序排序。 我們可以使用以下代碼創建Sort對象:
new Sort(Sort.Direction.DESC, "id", "description")第三,當不同字段的排序順序不同時,我們想使用多個字段的值對查詢結果進行排序。 假設我們要使用描述字段以降序對查詢結果進行排序,并使用id字段以升序對查詢結果進行排序。 我們可以使用以下代碼創建Sort對象:
new Sort(Sort.Direction.DESC, "description").and(new Sort(Sort.Direction.ASC, "id"))現在我們知道如何創建新的Sort對象。 讓我們繼續實踐該理論。
對查詢方法的查詢結果進行排序
使用查詢方法構建查詢時,可以按照以下步驟對查詢結果進行排序:
讓我們繼續前進,找出實現方法。
修改存儲庫界面
通過將新的Sort參數添加到我們的查詢方法中,我們可以對查詢的查詢結果進行排序 。 此方法參數指定執行的查詢的排序選項。 讓我們繼續看一下查詢方法的聲明。
從方法名稱查詢生成
通過使用從方法名策略生成查詢來創建執行的查詢時,我們必須在TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法中添加一個Sort參數。 我們的存儲庫界面的源代碼如下所示:
import org.springframework.data.domain.Sort; import org.springframework.data.solr.repository.Query; import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends PartialUpdateRepository, SolrCrudRepository<TodoDocument, String> {public List<TodoDocument> findByTitleContainsOrDescriptionContains(String title, String description, Sort sort); }命名查詢
當使用命名查詢創建執行的查詢時,我們必須在TodoDocumentRepository接口的findByNamedQuery()方法中添加一個Sort參數。 我們的存儲庫界面的源代碼如下所示:
import org.springframework.data.domain.Sort; import org.springframework.data.solr.repository.Query; import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends PartialUpdateRepository, SolrCrudRepository<TodoDocument, String> {@Query(name = "TodoDocument.findByNamedQuery")public List<TodoDocument> findByNamedQuery(String searchTerm, Sort sort); }注意:如果由于已知的bug,我們在使用Spring Data Solr RC1時,這種方法不起作用。 我們要么使用構建快照依賴項,要么等待RC2的發布。
@Query注釋
使用@Query批注創建執行的查詢時,我們必須在TodoDocumentRepository接口的findByQueryAnnotation()方法中添加一個Sort參數。 我們的存儲庫界面的源代碼如下所示:
import org.springframework.data.domain.Sort; import org.springframework.data.solr.repository.Query; import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends PartialUpdateRepository, SolrCrudRepository<TodoDocument, String> {@Query("title:*?0* OR description:*?0*")public List<TodoDocument> findByQueryAnnotation(String searchTerm, Sort sort); }注意:如果由于已知的bug,我們在使用Spring Data Solr RC1時,這種方法不起作用。 我們要么使用構建快照依賴項,要么等待RC2的發布。
使用查詢方法
我們可以通過對RepositoryIndexService類的search()方法進行以下更改來使用修改后的查詢方法:
讓我們繼續來看一下search()方法的不同實現。
從方法名稱查詢生成
通過使用從方法名稱策略生成查詢來構建查詢時,可以使用TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法獲取查詢結果。
RepositoryTodoIndexService類的相關部分的源代碼如下所示:
import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List;@Service public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm) {return repository.findByTitleContainsOrDescriptionContains(searchTerm, searchTerm, sortByIdDesc());}private Sort sortByIdDesc() {return new Sort(Sort.Direction.DESC, "id");}//Other methods are omitted }命名查詢
使用命名查詢構建查詢時,可以使用TodoDocumentRepository接口的findByNamedQuery()方法獲取查詢結果。
RepositoryTodoIndexService的相關部分如下所示:
import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List;@Service public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm) {return repository.findByNamedQuery(searchTerm, sortByIdDesc());}private Sort sortByIdDesc() {return new Sort(Sort.Direction.DESC, "id");}//Other methods are omitted }@Query批注
使用@Query批注構建查詢時,可以使用TodoDocumentRepository接口的findByQueryAnnotation()方法獲取查詢結果。
RepositoryTodoIndexService類的相關部分如下所示:
import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List;@Service public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm) {return repository.findByQueryAnnotation(searchTerm, sortByIdDesc());}private Sort sortByIdDesc() {return new Sort(Sort.Direction.DESC, "id");}//Other methods are omitted }對動態查詢的查詢結果進行排序
由于動態查詢是通過向存儲庫接口添加自定義方法而創建的,因此對動態查詢的查詢結果進行排序所需的步驟對示例應用程序的服務層無效。
通過對自定義存儲庫接口的實現進行以下更改,我們可以對動態查詢的查詢結果進行排序:
TodoDocumentRepositoryImpl類的相關部分如下所示:
import org.springframework.data.domain.Page; import org.springframework.data.domain.Sort; import org.springframework.data.solr.core.SolrTemplate; import org.springframework.data.solr.core.query.Criteria; import org.springframework.data.solr.core.query.SimpleQuery; import org.springframework.stereotype.Repository;import javax.annotation.Resource; import java.util.List;@Repository public class TodoDocumentRepositoryImpl implements CustomTodoDocumentRepository {@Resourceprivate SolrTemplate solrTemplate;@Overridepublic List<TodoDocument> search(String searchTerm) {String[] words = searchTerm.split(" ");Criteria conditions = createSearchConditions(words);SimpleQuery search = new SimpleQuery(conditions);//SET SORT OPTIONSsearch.addSort(sortByIdDesc());Page results = solrTemplate.queryForPage(search, TodoDocument.class);return results.getContent();}private Criteria createSearchConditions(String[] words) {Criteria conditions = null;for (String word: words) {if (conditions == null) {conditions = new Criteria("id").contains(word).or(new Criteria("description").contains(word));}else {conditions = conditions.or(new Criteria("id").contains(word)).or(new Criteria("description").contains(word));}}return conditions;}private Sort sortByIdDesc() {return new Sort(Sort.Direction.DESC, "id");}//Other methods are omitted }摘要
現在,我們已經了解了如何使用Spring Data Solr對查詢結果進行排序。 本教程教會了我們三件事:
- 我們知道可以通過使用Sort類來指定使用的排序選項。
 - 我們了解到,可以通過向查詢方法添加新的方法參數來對查詢方法的查詢結果進行排序。
 - 我們了解到,可以使用Query接口的addSort()方法將排序選項設置為動態查詢。
 
我的Spring Data Solr教程的下一部分描述了如何對查詢的查詢結果進行分頁 。
 PS:此博客文章的示例應用程序可在Github上獲得( 查詢方法和動態查詢 )。 
翻譯自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-sorting.html
總結
以上是生活随笔為你收集整理的Spring Data Solr教程:排序的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Java垃圾收集蒸馏
 - 下一篇: 将内存消耗减少20倍