javascript
Spring Data Solr教程:排序
當(dāng)我們實(shí)現(xiàn)單詞搜索功能時(shí),我們通常希望通過使用每個(gè)搜索結(jié)果的相關(guān)性以降序?qū)λ阉鹘Y(jié)果進(jìn)行排序。 這也是Solr的默認(rèn)行為。
但是,在某些情況下,有必要手動指定排序順序。 一種此類情況是“常規(guī)”搜索功能的實(shí)現(xiàn),該功能已在我的Spring Data Solr教程的上一部分中進(jìn)行了討論。
這篇博客文章描述了如何使用Spring Data Solr對查詢結(jié)果進(jìn)行排序。 更具體地說,我們必須修改示例應(yīng)用程序的搜索功能,以通過使用id字段的值將搜索結(jié)果降序排列。
此博客文章分為三個(gè)部分:
- 第一部分描述了如何指定查詢中使用的排序選項(xiàng)。
- 第二部分描述了在使用查詢方法構(gòu)建查詢時(shí)如何對查詢結(jié)果進(jìn)行排序。
- 第三部分教我們?nèi)绾螌討B(tài)查詢的查詢結(jié)果進(jìn)行排序。
讓我們開始吧。
注意:這些博客文章提供了其他信息,可幫助我們理解此博客文章中描述的概念:
- 使用Maven運(yùn)行Solr
- Spring Data Solr教程:Solr簡介
- Spring Data Solr教程:配置
- Spring Data Solr教程CRUD(幾乎)
- Spring Data Solr教程:將自定義方法添加到單個(gè)存儲庫
- Spring Data Solr教程:動態(tài)查詢
指定查詢的排序選項(xiàng)
查詢的排序選項(xiàng)是使用Sort類指定的。 下面給出了對查詢結(jié)果進(jìn)行排序的典型要求:
- 通過使用單個(gè)字段的值對查詢結(jié)果進(jìn)行排序。
- 當(dāng)不同字段的排序順序相同時(shí),通過使用多個(gè)字段的值對查詢結(jié)果進(jìn)行排序。
- 當(dāng)不同字段的排序順序不同時(shí),通過使用多個(gè)字段的值對查詢結(jié)果進(jìn)行排序。
讓我們看一下如何創(chuàng)建一個(gè)滿足給定要求的Sort對象。
首先,我們必須創(chuàng)建一個(gè)Sort對象,該對象指定使用單個(gè)字段對查詢結(jié)果進(jìn)行排序。 假設(shè)我們要使用id字段按升序?qū)Σ樵兘Y(jié)果進(jìn)行排序。 我們可以使用以下代碼創(chuàng)建Sort對象:
new Sort(Sort.Direction.ASC, "id")其次,我們必須創(chuàng)建一個(gè)Sort對象,該對象聲明當(dāng)不同字段的排序順序相同時(shí),使用多個(gè)字段的值對查詢結(jié)果進(jìn)行排序。 假設(shè)我們必須使用id和description字段對查詢結(jié)果進(jìn)行降序排序。 我們可以使用以下代碼創(chuàng)建Sort對象:
new Sort(Sort.Direction.DESC, "id", "description")第三,當(dāng)不同字段的排序順序不同時(shí),我們想使用多個(gè)字段的值對查詢結(jié)果進(jìn)行排序。 假設(shè)我們要使用描述字段以降序?qū)Σ樵兘Y(jié)果進(jìn)行排序,并使用id字段以升序?qū)Σ樵兘Y(jié)果進(jìn)行排序。 我們可以使用以下代碼創(chuàng)建Sort對象:
new Sort(Sort.Direction.DESC, "description").and(new Sort(Sort.Direction.ASC, "id"))現(xiàn)在我們知道如何創(chuàng)建新的Sort對象。 讓我們繼續(xù)實(shí)踐該理論。
對查詢方法的查詢結(jié)果進(jìn)行排序
使用查詢方法構(gòu)建查詢時(shí),可以按照以下步驟對查詢結(jié)果進(jìn)行排序:
讓我們繼續(xù)前進(jìn),找出實(shí)現(xiàn)方法。
修改存儲庫界面
通過將新的Sort參數(shù)添加到我們的查詢方法中,我們可以對查詢的查詢結(jié)果進(jìn)行排序 。 此方法參數(shù)指定執(zhí)行的查詢的排序選項(xiàng)。 讓我們繼續(xù)看一下查詢方法的聲明。
從方法名稱查詢生成
通過使用從方法名策略生成查詢來創(chuàng)建執(zhí)行的查詢時(shí),我們必須在TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法中添加一個(gè)Sort參數(shù)。 我們的存儲庫界面的源代碼如下所示:
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); }命名查詢
當(dāng)使用命名查詢創(chuàng)建執(zhí)行的查詢時(shí),我們必須在TodoDocumentRepository接口的findByNamedQuery()方法中添加一個(gè)Sort參數(shù)。 我們的存儲庫界面的源代碼如下所示:
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時(shí),這種方法不起作用。 我們要么使用構(gòu)建快照依賴項(xiàng),要么等待RC2的發(fā)布。
@Query注釋
使用@Query批注創(chuàng)建執(zhí)行的查詢時(shí),我們必須在TodoDocumentRepository接口的findByQueryAnnotation()方法中添加一個(gè)Sort參數(shù)。 我們的存儲庫界面的源代碼如下所示:
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時(shí),這種方法不起作用。 我們要么使用構(gòu)建快照依賴項(xiàng),要么等待RC2的發(fā)布。
使用查詢方法
我們可以通過對RepositoryIndexService類的search()方法進(jìn)行以下更改來使用修改后的查詢方法:
讓我們繼續(xù)來看一下search()方法的不同實(shí)現(xiàn)。
從方法名稱查詢生成
通過使用從方法名稱策略生成查詢來構(gòu)建查詢時(shí),可以使用TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法獲取查詢結(jié)果。
RepositoryTodoIndexService類的相關(guān)部分的源代碼如下所示:
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 }命名查詢
使用命名查詢構(gòu)建查詢時(shí),可以使用TodoDocumentRepository接口的findByNamedQuery()方法獲取查詢結(jié)果。
RepositoryTodoIndexService的相關(guān)部分如下所示:
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批注構(gòu)建查詢時(shí),可以使用TodoDocumentRepository接口的findByQueryAnnotation()方法獲取查詢結(jié)果。
RepositoryTodoIndexService類的相關(guān)部分如下所示:
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 }對動態(tài)查詢的查詢結(jié)果進(jìn)行排序
由于動態(tài)查詢是通過向存儲庫接口添加自定義方法而創(chuàng)建的,因此對動態(tài)查詢的查詢結(jié)果進(jìn)行排序所需的步驟對示例應(yīng)用程序的服務(wù)層無效。
通過對自定義存儲庫接口的實(shí)現(xiàn)進(jìn)行以下更改,我們可以對動態(tài)查詢的查詢結(jié)果進(jìn)行排序:
TodoDocumentRepositoryImpl類的相關(guān)部分如下所示:
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 }摘要
現(xiàn)在,我們已經(jīng)了解了如何使用Spring Data Solr對查詢結(jié)果進(jìn)行排序。 本教程教會了我們?nèi)?#xff1a;
- 我們知道可以通過使用Sort類來指定使用的排序選項(xiàng)。
- 我們了解到,可以通過向查詢方法添加新的方法參數(shù)來對查詢方法的查詢結(jié)果進(jìn)行排序。
- 我們了解到,可以使用Query接口的addSort()方法將排序選項(xiàng)設(shè)置為動態(tài)查詢。
我的Spring Data Solr教程的下一部分描述了如何對查詢的查詢結(jié)果進(jìn)行分頁 。
PS:此博客文章的示例應(yīng)用程序可在Github上獲得( 查詢方法和動態(tài)查詢 )。
翻譯自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-sorting.html
總結(jié)
以上是生活随笔為你收集整理的Spring Data Solr教程:排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java垃圾收集蒸馏
- 下一篇: Spring MVC错误处理流程