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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Data Solr教程:查询方法

發布時間:2023/12/3 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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批注

    在以下小節中將更詳細地描述這些技術。

    從方法名稱查詢生成

    從方法名稱生成查詢是一種查詢生成策略,其中從查詢方法的名稱解析執行的查詢。

  • 查詢方法的名稱必須以特殊的前綴開頭,該前綴標識查詢方法。 這些前綴是: find,findBy,get,getBy,read和readBy 。 解析執行的查詢時,將從方法名稱中刪除此前綴。
  • 屬性表達式用于引用我們文檔類的屬性。
  • 特殊關鍵字與屬性表達式一起使用,以指定在創建的查詢中使用的運算符。 在屬性表達式之后,將這些關鍵字添加到查詢方法的名稱中。
  • 我們可以通過在屬性表達式之間添加And或Or關鍵字來組合屬性表達式。
  • 查詢方法的參數計數必須等于其名稱中使用的屬性表達式的數量。
  • 通過閱讀以下資源,我們可以獲得有關屬性表達式和存儲庫關鍵字的更多信息:

    • Spring Data Solr參考手冊:查詢創建
    • Spring Data Solr參考手冊:存儲庫查詢關鍵字

    我們記得,我們的搜索功能必須返回標題或描述包含給定搜索詞的所有待辦事項。 同樣,我們的文檔類具有兩個在查詢中使用的屬性。 這些屬性稱為title和description 。 通過執行以下步驟,我們可以創建滿足搜索功能要求的方法名稱:

  • 將findBy前綴添加到方法名稱的開頭。
  • 在前綴之后添加title屬性的屬性表達式。
  • 在屬性表達式之后添加Contains關鍵字。
  • 將Or關鍵字添加到方法名稱。
  • 在Or關鍵字之后添加description屬性的屬性表達式。
  • 將Contains關鍵字添加到方法名稱。
  • 在我們的查詢方法中添加兩個方法參數。 第一個參數與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屬性配置命名查詢的名稱 。 。

    通過執行以下步驟,我們可以使用命名查詢實現查詢方法:

  • 指定命名查詢。
  • 創建查詢方法。
  • 下面將更詳細地描述這些步驟。

    指定命名查詢

    通過執行以下步驟,我們可以創建一個滿足查詢功能要求的命名查詢:

  • 創建包含命名查詢的屬性文件。
  • 使用前面描述的公式為命名查詢創建一個鍵。 由于文檔類的名稱為TodoDocument ,因此命名查詢的鍵為TodoDocument.findByNamedQuery 。
  • 使用Lucene查詢解析器語法創建命名查詢。 因為我們的查詢必須返回標題或描述包含給定搜索詞的文檔,所以我們的查詢是: title:*?0 * OR description:*?0 * ( ?0替換為查詢方法的第一個參數的值)。
  • META-INF / solr-named-query.properties文件的內容如下所示:

    TodoDocument.findByNamedQuery=title:*?0* OR description:*?0*

    創建查詢方法

    通過執行以下步驟,我們可以創建使用創建的命名查詢的查詢方法:

  • 將findByNamedQuery()方法添加到TodoDocumentRepository接口。 這個方法返回TodoDocument對象的列表中,并稱為SEARCHTERM一個字符串參數。
  • 用@Query注釋注釋該方法,并將其name屬性的值設置為'TodoDocument.findByNamedQuery'。 不需要此步驟,因為查詢方法的名稱與命名查詢的名稱相同,但是我想在此處演示@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(name = "TodoDocument.findByNamedQuery")public List<TodoDocument> findByNamedQuery(String searchTerm); }

    @Query注釋

    @Query批注可用于指定在調用查詢方法時執行的查詢。 通過執行以下步驟,我們可以創建滿足搜索功能要求的查詢方法:

  • 將findByQueryAnnotation()方法添加到TodoDocumentRepository接口。 這個方法返回TodoDocument對象的列表,它有一個名為SEARCHTERM一個字符串參數。
  • 用@Query注釋對方法進行注釋。
  • 將執行的查詢設置為@Query批注的值。 我們可以使用Lucene查詢解析器語法創建查詢。 因為我們的查詢必須返回標題或描述包含給定搜索詞的文檔,所以正確的查詢是: title:*?0 * OR description:*?0 * ( ?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("title:*?0* OR description:*?0*")public List<TodoDocument> findByQueryAnnotation(String searchTerm); }

    使用創建的查詢方法

    我們可以按照以下步驟使用創建的查詢方法:

  • 在TodoIndexService接口中聲明search()方法。
  • 將search()方法的實現添加到RepositoryTodoIndexService類。
  • 在以下小節中將更詳細地描述這些步驟。

    聲明搜索方法

    我們的第一步是在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上提供了演示此博客條目中描述的概念的示例應用程序。 在本教程的下一部分中,我們將學習如何將自定義功能添加到單個存儲庫 。

    參考: Spring Data Solr教程: Petri Kainulainen博客上來自我們JCG合作伙伴 Petri Kainulainen的查詢方法 。

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

    總結

    以上是生活随笔為你收集整理的Spring Data Solr教程:查询方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。