javascript
Spring Data Solr教程:查询方法
我們已經了解了如何配置Spring Data Solr。 我們還學習了如何向Solr索引添加新文檔,如何更新現有文檔的信息以及從Solr索引刪除文檔。 現在是時候繼續前進,學習如何使用Spring Data Solr從Solr索引中搜索信息。 我們的搜索功能的要求如下:
- 搜索功能必須返回標題或描述包含給定搜索詞的所有待辦事項。
- 搜索必須不區分大小寫。
我們可以按照以下步驟實現搜索功能:
讓我們繼續研究如何使用查詢方法實現搜索功能。
注意:這些博客條目提供了其他信息,有助于我們理解此博客條目中描述的概念:
- 使用Maven運行Solr
- Spring Data Solr教程:Solr簡介
- Spring Data Solr教程:配置
- Spring Data Solr教程CRUD(幾乎)
創建查詢方法
查詢方法是
我們可以通過以下技術使用Spring Data Solr創建查詢方法:
- 從方法名稱查詢生成
- 命名查詢
- @Query批注
在以下小節中將更詳細地描述這些技術。
從方法名稱查詢生成
從方法名稱生成查詢是一種查詢生成策略,其中從查詢方法的名稱解析執行的查詢。
通過閱讀以下資源,我們可以獲得有關屬性表達式和存儲庫關鍵字的更多信息:
- Spring Data Solr參考手冊:查詢創建
- Spring Data Solr參考手冊:存儲庫查詢關鍵字
我們記得,我們的搜索功能必須返回標題或描述包含給定搜索詞的所有待辦事項。 同樣,我們的文檔類具有兩個在查詢中使用的屬性。 這些屬性稱為title和description 。 通過執行以下步驟,我們可以創建滿足搜索功能要求的方法名稱:
TodoDocumentRepository接口的源代碼如下所示:
import org.springframework.data.solr.repository.SolrCrudRepository; import java.util.List;public interface TodoDocumentRepository extends SolrCrudRepository<TodoDocument, String> {public List<TodoDocument> findByTitleContainsOrDescriptionContains(String title, String description); }注意:如果搜索詞包含多個單詞,則此查詢方法將不起作用。
命名查詢
命名查詢是在單獨的屬性文件中聲明并連接到正確查詢方法的查詢。 以下描述了有關用于聲明命名查詢的屬性文件的規則:
- 屬性文件的默認位置是META-INF / solr-named-queries.properties,但是我們可以使用@EnableSolrRepositories批注的namedQueriesLocation屬性來配置位置。
- 使用以下公式創建每個命名查詢的鍵: [文檔類的名稱]。[命名查詢的名稱] 。
使用以下規則,將在屬性文件中配置的命名查詢與我們的存儲庫界面的查詢方法進行匹配:
- 執行命名查詢的查詢方法的名稱必須與命名查詢的名稱相同。
- 如果查詢方法的名稱與命名查詢的名稱不同,則必須使用@Query注釋對查詢方法進行注釋,并且必須使用@Query注釋的name屬性配置命名查詢的名稱 。 。
通過執行以下步驟,我們可以使用命名查詢實現查詢方法:
下面將更詳細地描述這些步驟。
指定命名查詢
通過執行以下步驟,我們可以創建一個滿足查詢功能要求的命名查詢:
META-INF / solr-named-query.properties文件的內容如下所示:
TodoDocument.findByNamedQuery=title:*?0* OR description:*?0*創建查詢方法
通過執行以下步驟,我們可以創建使用創建的命名查詢的查詢方法:
TodoDocumentRepository接口的源代碼如下所示:
import org.springframework.data.solr.repository.Query; import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends SolrCrudRepository<TodoDocument, String> {@Query(name = "TodoDocument.findByNamedQuery")public List<TodoDocument> findByNamedQuery(String searchTerm); }@Query注釋
@Query批注可用于指定在調用查詢方法時執行的查詢。 通過執行以下步驟,我們可以創建滿足搜索功能要求的查詢方法:
TodoDocumentRepository接口的源代碼如下所示:
import org.springframework.data.solr.repository.Query; import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends SolrCrudRepository<TodoDocument, String> {@Query("title:*?0* OR description:*?0*")public List<TodoDocument> findByQueryAnnotation(String searchTerm); }使用創建的查詢方法
我們可以按照以下步驟使用創建的查詢方法:
在以下小節中將更詳細地描述這些步驟。
聲明搜索方法
我們的第一步是在TodoIndexService接口中聲明搜索方法。 TodoIndexService接口的相關部分如下所示:
import java.util.List;public interface TodoIndexService {public List<TodoDocument> search(String searchTerm); }實施搜索方法
我們的第二步是實現search()方法。 我們的實現非常簡單。 它通過調用TodoDocumentRepository接口的正確方法來獲取TodoDocument對象的列表,并返回該列表。
查詢方法的名稱取決于用于創建查詢方法的技術。 下面描述不同的實現。
從方法名稱查詢生成
當我們從查詢方法的名稱生成查詢時,我們的實現通過調用TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法獲取TodoDocument對象的列表,并返回該列表。
RepositoryTodoIndexService類的相關部分如下所示:
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);} }命名查詢
如果使用命名查詢,則我們的實現將通過調用TodoDocumentRepository接口的findByNamedQuery()方法獲取TodoDocument對象的列表,并返回該列表。
RepositoryTodoIndexService類的相關部分如下所示:
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);} }@Query注釋
當我們使用@Query批注時,我們的實現通過調用TodoDocumentRepository接口的findByQueryAnnotation()方法獲取TodoDocument對象的列表,并返回該列表。
RepositoryTodoIndexService類的相關部分如下所示:
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);} }選擇正確的查詢創建技術
顯而易見的問題是:
將查詢方法添加到我們的Spring Data Solr存儲庫中的最佳方法是什么?
在為查詢方法確定正確的查詢創建技術時,可以使用以下準則:
- 如果創建的查詢非常簡單,則從方法名稱生成查詢通常是最佳選擇。 這種方法的問題在于,用這種方法實現“復雜”查詢會導致方法名稱冗長而丑陋。
- 將查詢保持在查詢方法附近是一個好主意。 使用@Query批注的好處是,我們可以通過閱讀存儲庫接口的源代碼來查看執行的查詢和查詢方法。
- 如果我們想將執行的查詢與存儲庫接口分開,則應使用命名查詢。 這種方法的問題是我們必須從屬性文件中檢查已執行的查詢,這非常麻煩。
摘要
現在,我們已經了解了如何使用Spring Data Solr創建靜態查詢。 這篇博客文章告訴我們兩件事:
- 我們知道什么是查詢方法,以及如何創建它們。
- 我們熟悉各種查詢創建技術,并且知道何時使用它們。
Github上提供了演示此博客條目中描述的概念的示例應用程序。 在本教程的下一部分中,我們將學習如何將自定義功能添加到單個存儲庫 。
翻譯自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-query-methods.html
總結
以上是生活随笔為你收集整理的Spring Data Solr教程:查询方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 只需改变路由器位置路由器如何换地方使用
- 下一篇: Spring框架–应用程序上下文–到达应