javascript
Spring Data Solr教程:动态查询
Solr通常被稱為搜索服務器,我們可以在實現全文搜索功能時使用它。 但是,當我們實現從搜索表單獲取其輸入的搜索功能時,利用Solr的性能通常是明智的。
在這種情況下,執行的搜索查詢取決于收到的輸入。 這意味著查詢參數的數量取決于輸入到搜索表單的輸入。 換句話說,執行的搜索查詢是動態的。
我的Spring Data Solr教程的前一部分教我們如何將自定義方法添加到單個存儲庫。 現在該使用這些信息并了解如何使用Spring Data Solr創建動態查詢。 讓我們開始吧。
注意:這些博客條目提供了其他信息,可以幫助我們理解此博客文章中描述的概念:
- 使用Maven運行Solr
- Spring Data Solr教程:Solr簡介
- Spring Data Solr教程:配置
- Spring Data Solr教程CRUD(幾乎)
- Spring Data Solr教程:將自定義方法添加到單個存儲庫
創建動態查詢
本節描述了如何使用Spring Data Solr創建動態查詢。 它分為兩個小節,如下所述:
- 第一部分描述了在開始實際搜索功能之前需要了解的基礎知識。
- 第二部分描述了如何通過向Spring Data Solr存儲庫添加自定義方法來實現示例應用程序的搜索功能。
學習基礎
在開始實現示例應用程序的搜索功能之前,我們需要知道如何使用Spring Data Solr“手動”創建查詢。 我們可以按照以下步驟“手動”創建查詢:
下面將更詳細地描述這些步驟。
創建搜索條件
首先,我們必須為查詢創建搜索條件。 我們可以使用以下描述的條件類來做到這一點:
- org.springframework.data.solr.core.query.SimpleStringCriteria類是基本條件類,用于通過使用已經格式化的查詢字符串來指定執行的查詢。 此類中指定的查詢字符串按原樣執行。 因此,此類不能用于構建動態查詢。
- org.springframework.data.solr.core.query.Criteria是用于構建動態查詢的條件類。 它具有流暢的API,該API支持多個Criteria對象的鏈接。
創建執行的查詢
其次,我們必須創建執行的查詢。 下面介紹Spring Data Solr的查詢類:
- org.springframework.data.solr.core.query.SimpleQuery類是一個支持分頁和分組的查詢類。
- org.springframework.data.solr.core.query.SimpleFacetQuery類是支持多面搜索的查詢類。
- org.springframework.data.solr.core.query.SimpleFilterQuery類是支持過濾器查詢的查詢類。
執行創建的查詢
第三,我們必須執行創建的查詢。 SolrTemplate類實現了一些可用于此目的的方法。 下面介紹了這些方法:
- long count(最終SolrDataQuery查詢)方法返回使用作為方法參數給出的查詢找到的文檔數。
- UpdateResponse delete(SolrDataQuery query)方法刪除與作為方法參數給出的查詢匹配的文檔,并返回一個UpdateResponse對象。
- T queryForObject(Query query,Class <T> clazz)方法返回與作為方法參數給出的查詢匹配的單個文檔。
- FacetPage <T> queryForFacetPage(FacetQuery query,Class <T> clazz)方法針對Solr索引執行構面查詢,并將查詢結果作為FacetPage對象返回。
- Page <T> queryForPage(Query query,Class <T> clazz)方法對Solr索引執行查詢,并作為Page接口的實現返回查詢結果。
讓我們繼續實踐該理論。
實現搜索功能
我們的搜索功能的要求如下:
- 搜索功能必須返回名稱或描述包含給定搜索詞的某些單詞的所有待辦事項。 換句話說,如果搜索詞是“ Foo Bar”,則我們的搜索功能必須返回標題或描述包含“ Foo”或“ Bar”的待辦事項條目。
- 搜索必須不區分大小寫。
因為我們的搜索功能不是靜態的,所以我們必須使用動態查詢來創建它。 我們可以通過在Spring Data Solr存儲庫中添加自定義方法來使用Spring Data Solr創建動態查詢。 換句話說,我們必須遵循以下步驟:
下面將更詳細地描述這些步驟。
創建自定義界面
首先,我們必須創建一個自定義接口,該接口聲明我們的自定義搜索方法。 我們可以按照以下步驟進行操作:
CustomTodoDocumentRepository接口的源代碼如下所示:
public interface CustomTodoDocumentRepository {public List<TodoDocument> search(String searchTerm);//Other methods are omitted. }實施創建的接口
其次,我們必須實現我們之前創建的自定義接口。 我們可以按照以下步驟進行操作:
search()方法的實現需要在此給出更詳細的描述。 我們可以通過執行以下步驟來實現search()方法:
TodoDocumentRepositoryImpl類的源代碼如下所示:
import org.springframework.data.domain.Page; 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;@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);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(“title”).contains(word).or(new Criteria(“description”).contains(word));}else {conditions = conditions.or(new Criteria(“title”).contains(word)).or(new Criteria(“description”).contains(word));}}return conditions;}//Other methods are omitted }修改存儲庫界面
第三,我們必須使我們的自定義search()方法對存儲庫的用戶可見。 我們可以通過擴展CustomTodoDocumentRepository接口來實現。 TodoDocumentRepository接口的源代碼如下所示:
import org.springframework.data.solr.repository.SolrCrudRepository;public interface TodoDocumentRepository extends CustomTodoDocumentRepository, SolrCrudRepository<TodoDocument, String> {}現在,我們向Spring Data Solr存儲庫添加了一個自定義search()方法。 讓我們找出如何使用此方法。
使用自定義方法
我們可以通過修改RepositoryTodoIndexService類的search()方法來使用自定義方法。 此方法的新實現非常簡單。 它通過調用我們的Spring Data Solr存儲庫的search()方法獲取搜索結果,并返回搜索結果。
RepositoryTodoIndexService類的源代碼如下所示:
import org.springframework.stereotype.Service;import javax.annotation.Resource; import java.util.List;@Service public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;//Other methods are omitted.@Overridepublic List<TodoDocument> search(String searchTerm) {return repository.search(searchTerm);} }摘要
現在,我們已經使用Spring Data Solr實現了動態搜索功能。 盡管我們的搜索功能非常簡單,但是我們現在也應該能夠實現更復雜的查詢。
本教程教了我們兩件事:
- 我們學習了如何使用Spring Data Solr“手動”創建查詢。
- 我們了解到,必須通過向單個存儲庫添加自定義方法來實現動態搜索方法。
我的Spring Data Solr教程的下一部分描述了如何對查詢結果進行排序。
PS此博客文章的示例應用程序可在Github上獲得 。
翻譯自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-dynamic-queries.html
總結
以上是生活随笔為你收集整理的Spring Data Solr教程:动态查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯混元大模型已开始内测 近期将正式对外
- 下一篇: 番石榴的EventBus –简单的发布者