javascript
Spring Data Solr入门
Spring Data Solr是Spring Data項目的擴展,該項目旨在簡化Apache Solr在Spring應用程序中的使用。 請注意,這不是Spring(數據)或Solr的簡介。 我認為您至少對這兩種技術都有一些基本的了解。 在下面的文章中,我將展示如何使用Spring Data存儲庫訪問Spring應用程序中的Solr功能。
組態
首先,我們需要一個正在運行的Solr服務器。 為簡單起見,我們將使用當前Solr版本(在撰寫本文時為4.5.1)隨附的示例配置,并在官方Solr教程中進行了描述。 因此,我們只需要下載Solr,將其解壓縮到我們選擇的目錄中,然后從<solr home> / example目錄運行java -jar start.jar。
現在,讓我們轉到演示應用程序,并使用maven添加Spring Data Solr依賴項:
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-solr</artifactId><version>1.0.0.RELEASE</version> </dependency>在這個示例中,我使用Spring Boot設置了一個小的示例Spring應用程序。 我為此使用了以下Spring Boot依賴項和Spring Boot父pom:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>0.5.0.BUILD-SNAPSHOT</version> </parent><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency>如果您還沒有使用過Spring Boot,請不要擔心。 這些依賴關系主要充當常見(Spring)依賴關系的捷徑,并稍微簡化了配置。 如果要將Spring Data Solr集成到現有的Spring應用程序中,則可以跳過Spring Boot依賴項。
Spring bean的配置非常簡單,我們只需要自己定義兩個bean:
@ComponentScan @EnableSolrRepositories("com.mscharhag.solr.repository") public?class?Application?{@Beanpublic?SolrServer?solrServer()?{return?new?HttpSolrServer("http://localhost:8983/solr");}@Beanpublic?SolrTemplate?solrTemplate(SolrServer?server)?throws?Exception?{return?new?SolrTemplate(server);} }solrServer bean用于連接到正在運行的Solr實例。 由于Spring Data Solr使用Solrj,因此我們創建了Solrj HttpSolrServer實例。 通過使用EmbeddedSolrServer也可以使用嵌入式Solr服務器。 SolrTemplate提供了與Solr一起使用的通用功能(類似于Spring的JdbcTemplate)。 創建Solr存儲庫需要使用solrTemplate bean。 另請注意@EnableSolrRepositories批注。 有了這個注釋,我們告訴Spring Data Solr在指定的包中查找Solr存儲庫。
建立文件
在查詢Solr之前,我們必須將文檔添加到索引。 要定義文檔,我們創建一個POJO并向其中添加Solrj批注。 在此示例中,我們將使用一個簡單的Book類作為文檔:
public?class?Book?{@Fieldprivate?String?id;@Fieldprivate?String?name;@Fieldprivate?String?description;@Field("categories_txt")private?List<Category>?categories;//?getters/setters }public?enum?Category?{EDUCATION,?HISTORY,?HUMOR,?TECHNOLOGY,?ROMANCE,?ADVENTURE }每本書都有唯一的ID,名稱,說明,并屬于一個或多個類別。 請注意,默認情況下,Solr需要每個文檔的String類型的唯一ID。 應該添加到Solr索引的字段使用Solrj @Field注釋進行注釋。 默認情況下,Solrj嘗試將文檔字段名稱映射到同名的Solr字段。 Solr示例配置已經定義了名為id,名稱和描述的Solr字段,因此不必將這些字段添加到Solr配置中。
如果要更改Solr字段定義,可以在<solr home> /example/solr/collection1/conf/schema.xml中找到示例配置文件。 在此文件中,您應該找到以下字段定義:
<field?name="id"?type="string"?indexed="true"?stored="true"?required="true"?multiValued="false"?/>? <field?name="name"?type="text_general"?indexed="true"?stored="true"?/> <field?name="description"?type="text_general"?indexed="true"?stored="true"/>一般而言,書名比書名更好。 但是,通過使用名稱,我們可以使用默認的Solr字段配置。 因此,出于簡單原因,我選擇名稱而不是標題。
對于類別,我們必須使用@Field批注手動定義字段名稱:Categories_txt。 這與Solr示例中名為* _txt的動態字段匹配。 也可以在schema.xml中找到此字段定義:
<dynamicField?name="*_txt"?type="text_general"???indexed="true"??stored="true"?multiValued="true"/>創建一個倉庫
Spring Data使用存儲庫來簡化各種數據訪問技術的使用。 倉庫基本上是一個接口,其實現由Spring Data在應用程序啟動時動態生成。 生成的實現基于存儲庫接口中使用的命名約定。 如果這是您的新手,建議閱讀使用Spring數據存儲庫 。
Spring Data Solr使用相同的方法。 我們在接口內部使用命名約定和注釋來定義訪問Solr功能所需的方法。 我們從一個僅包含一種方法的簡單存儲庫開始(稍后將添加更多方法):
public?interface?BookRepository?extends?SolrCrudRepository<Book,?String>?{List<Book>?findByName(String?name);}通過擴展SolrCrudRepository,我們可以在存儲庫中獲得一些常用方法,如save(),findAll(),delete()或count()。 使用接口方法findByName(String name)的定義,我們告訴Spring Data Solr創建一個方法實現,該方法實現向Solr查詢書籍列表。 此列表中的書名應與傳遞的參數匹配。
可以使用Spring的DI功能將存儲庫實現注入到其他類中。 在此示例中,我們將存儲庫注入到簡單的JUnit測試中:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes?=?Application.class,?loader=SpringApplicationContextLoader.class) public?class?BookRepositoryTests?{@Autowiredprivate?BookRepository?bookRepository;... }向Solr添加文檔
現在是時候向Solr添加一些書籍了。 使用我們的存儲庫,這是一項非常簡單的工作:
private?void?addBookToIndex(String?name,?String?description,?Category...?categories)?{Book?book?=?new?Book();book.setName(name);book.setDescription(description);book.setCategories(Arrays.asList(categories));book.setId(UUID.randomUUID().toString());bookRepository.save(book); }private?void?createSampleData()?{addBookToIndex("Treasure?Island",?"Best?seller?by?R.L.S.", Category.ADVENTURE);addBookToIndex("The?Pirate?Island",?"Oh?noes,?the?pirates?are?coming!", Category.ADVENTURE, Category.HUMOR);... }增加分頁并增強
假設我們有一個應用程序,用戶可以在其中搜索書籍。 我們需要查找名稱或描述與用戶給出的搜索查詢相匹配的書籍。 出于性能原因,我們希望添加某種分頁功能,該分頁功能一次只能向用戶顯示10個搜索結果。
讓我們在存儲庫界面中為此創建一個新方法:
Page<Book>?findByNameOrDescription(@Boost(2)?String?name,?String?description,?Pageable?pageable);方法名稱findByNameOrDescription告訴Spring Data Solr查詢名稱或描述與傳遞的參數匹配的書籍對象。 為了支持分頁,我們添加了Pageable參數,并將返回類型從List <Book>更改為Page <Book>。 通過在名稱參數中添加@Boost批注,可以增強名稱與搜索參數匹配的書籍。 這是有道理的,因為這些書通常對用戶更感興趣。
如果現在我們要查詢包含10個元素的第一頁,我們只需要做:
Page<Book>?booksPage?=?bookRepository.findByNameOrDescription (searchString,?searchString,?new?PageRequest(0,?10));除前10個搜索結果外,Page <Book>提供了一些用于建立分頁功能的有用方法:
booksPage.getContent()???????//?get?a?list?of?(max)?10?books booksPage.getTotalElements() //?total?number?of?elements?(can?be?>10) booksPage.getTotalPages()????//?total?number?of?pages booksPage.getNumber()????? ?//?current?page?number booksPage.isFirstPage()??????//?true?if?this?is?the?first?page booksPage.hasNextPage()??????//?true?if?another?page?is?available booksPage.nextPageable()???? //?the?pageable?for?requesting?the?next?page ...刻面
每當用戶搜索書名時,我們都想向他顯示不同類別中有多少本書符合給定的查詢參數。 此功能稱為分面搜索 ,Spring Data Solr直接支持此功能。 我們只需要向存儲庫接口添加另一種方法:
@Query("name:?0") @Facet(fields?=?{?"categories_txt"?},?limit?=?5) FacetPage<Book>?findByNameAndFacetOnCategories(String?name,?Pageable?page);這次查詢將從@Query批注(包含Solr查詢)而不是方法名稱派生。 使用@Facet批注,我們告訴Spring Data Solr按類別對構面進行分類,并返回前五個構面。
也可以刪除@Query批注并將方法名稱更改為findByName,以達到相同的效果。 這種方法的一個小缺點是,對于調用者來說,這種存儲庫方法確實可以執行構面操作,這一點并不明顯。 另外,方法簽名可能與其他按名稱搜索書籍的方法相沖突。
用法:
FacetPage<Book>?booksFacetPage?=?bookRepository.findByNameAndFacetOnCategories(bookName,?new?PageRequest(0,?10));booksFacetPage.getContent();?//?the?first?10?booksfor?(Page<??extends?FacetEntry>?page?:?booksFacetPage.getAllFacets())?{for?(FacetEntry?facetEntry?:?page.getContent())?{String?categoryName?=?facetEntry.getValue();? //?name?of?the?categorylong?count?=?facetEntry.getValueCount();???? //?number?of?books?in?this?category//?convert?the?category?name?back?to?an?enumCategory?category?=?Category.valueOf(categoryName.toUpperCase());} }請注意,booksFacetPage.getAllFacets()返回FacetEntry頁面的集合。 這是因為@Facet批注允許您一次對多個字段進行構面。 每個FacetPage最多包含 五個FacetEntries(由@Facet的limit屬性定義)。
突出顯示
通常,在搜索結果列表中突出顯示搜索查詢的出現很有用(例如,由google或bing來完成)。 這可以通過(Spring Data)Solr的突出顯示功能來實現。
讓我們添加另一個存儲庫方法:
@Highlight(prefix?=?"<highlight>",?postfix?=?"</highlight>") HighlightPage<Book>?findByDescription(String?description,?Pageable?pageable);@Highlight注釋告訴Solr突出顯示搜索到的描述的出現。
用法:
HighlightPage<Book>?booksHighlightPage?=?bookRepository.findByDescription(description,?new?PageRequest(0,?10));booksHighlightPage.getContent();?//?first?10?booksfor?(HighlightEntry<Book>?he?:?booksHighlightPage.getHighlighted())?{//?A?HighlightEntry?belongs?to?an?Entity?(Book)?and?may?have?multiple?highlighted?fields?(description)for?(Highlight?highlight?:?he.getHighlights())?{//?Each?highlight?might?have?multiple?occurrences?within?the?descriptionfor?(String?snipplet?:?highlight.getSnipplets())?{// snipplet contains the highlighted text}} }如果使用此存儲庫方法查詢描述包含字符串“ 金銀島”的書籍,則??摘要可能如下所示:
<highlight>Treasure?Island</highlight>?is?a?tale?of?pirates?and?villains,?maps,?treasure?and?shipwreck,?and?is?perhaps?one?of?the?best?adventure?story?ever?written.在這種情況下, 金銀島位于說明的開頭,并使用@Highlight注釋中定義的前綴和后綴突出顯示。 當向用戶顯示搜索結果時,此附加標記可用于標記查詢的出現。
結論
Spring Data Solr提供了一種非常簡單的方法來將Solr集成到Spring應用程序中。 使用存儲庫抽象,它遵循大多數其他Spring Data項目所做的相同設計原則。 我在使用Spring Data Solr時遇到的唯一小缺點是可以在此處和此處進行改進的文檔。
- 您可以在GitHub上找到此示例的完整源代碼。
翻譯自: https://www.javacodegeeks.com/2013/11/getting-started-with-spring-data-solr.html
總結
以上是生活随笔為你收集整理的Spring Data Solr入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旧电脑改车载(window改车载电脑)
- 下一篇: Spring交易可见性