日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Data Solr教程:排序

發(fā)布時(shí)間:2023/12/3 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Data Solr教程:排序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(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)行排序:

  • 將新的Sort參數(shù)添加到查詢方法。 此方法參數(shù)指定使用的排序選項(xiàng)。
  • 在服務(wù)層中創(chuàng)建一個(gè)新的Sort對象,并在調(diào)用查詢方法時(shí)將其作為方法參數(shù)傳遞。
  • 讓我們繼續(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)行以下更改來使用修改后的查詢方法:

  • 創(chuàng)建一個(gè)私有的sortByIdDesc()方法,該方法指定查詢結(jié)果通過使用文檔的ID降序排列。
  • 通過調(diào)用TodoDocumentRepository接口中聲明的查詢方法來獲取排序的查詢結(jié)果。
  • 返回查詢結(jié)果。
  • 讓我們繼續(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類添加一個(gè)私有的sortByIdDesc()方法。 此方法返回一個(gè)Sort對象,該對象指定通過使用文檔的ID對查詢結(jié)果進(jìn)行降序排序。
  • 修改TodoDocumentRepositoryImpl類的search()方法。 使用Query接口的addSort()方法將排序選項(xiàng)設(shè)置為執(zhí)行的查詢,并將創(chuàng)建的Sort對象作為方法參數(shù)傳遞。
  • 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)查詢 )。

    參考: Spring Data Solr教程:在Petri Kainulainen博客上從JCG合作伙伴 Petri Kainulainen進(jìn)行排序 。

    翻譯自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-sorting.html

    總結(jié)

    以上是生活随笔為你收集整理的Spring Data Solr教程:排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。