javascript
Spring Data Solr入门
Spring Data Solr是Spring Data項(xiàng)目的擴(kuò)展,該項(xiàng)目旨在簡化Apache Solr在Spring應(yīng)用程序中的使用。 請(qǐng)注意,這不是Spring(數(shù)據(jù))或Solr的簡介。 我認(rèn)為您至少對(duì)這兩種技術(shù)都有一些基本的了解。 在下面的文章中,我將展示如何使用Spring Data存儲(chǔ)庫訪問Spring應(yīng)用程序中的Solr功能。
組態(tài)
首先,我們需要一個(gè)正在運(yùn)行的Solr服務(wù)器。 為簡單起見,我們將使用當(dāng)前Solr版本(在撰寫本文時(shí)為4.5.1)隨附的示例配置,并在官方Solr教程中進(jìn)行了描述。 因此,我們只需要下載Solr,將其解壓縮到我們選擇的目錄中,然后從<solr home> / example目錄運(yùn)行java -jar start.jar。
現(xiàn)在,讓我們轉(zhuǎn)到演示應(yīng)用程序,并使用maven添加Spring Data Solr依賴項(xiàng):
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-solr</artifactId><version>1.0.0.RELEASE</version> </dependency>在這個(gè)示例中,我使用Spring Boot設(shè)置了一個(gè)小的示例Spring應(yīng)用程序。 我為此使用了以下Spring Boot依賴項(xiàng)和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,請(qǐng)不要擔(dān)心。 這些依賴關(guān)系主要充當(dāng)常見(Spring)依賴關(guān)系的捷徑,并稍微簡化了配置。 如果要將Spring Data Solr集成到現(xiàn)有的Spring應(yīng)用程序中,則可以跳過Spring Boot依賴項(xiàng)。
Spring bean的配置非常簡單,我們只需要自己定義兩個(gè)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用于連接到正在運(yùn)行的Solr實(shí)例。 由于Spring Data Solr使用Solrj,因此我們創(chuàng)建了Solrj HttpSolrServer實(shí)例。 通過使用EmbeddedSolrServer也可以使用嵌入式Solr服務(wù)器。 SolrTemplate提供了與Solr一起使用的通用功能(類似于Spring的JdbcTemplate)。 創(chuàng)建Solr存儲(chǔ)庫需要使用solrTemplate bean。 另請(qǐng)注意@EnableSolrRepositories批注。 有了這個(gè)注釋,我們告訴Spring Data Solr在指定的包中查找Solr存儲(chǔ)庫。
建立文件
在查詢Solr之前,我們必須將文檔添加到索引。 要定義文檔,我們創(chuàng)建一個(gè)POJO并向其中添加Solrj批注。 在此示例中,我們將使用一個(gè)簡單的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,名稱,說明,并屬于一個(gè)或多個(gè)類別。 請(qǐng)注意,默認(rèn)情況下,Solr需要每個(gè)文檔的String類型的唯一ID。 應(yīng)該添加到Solr索引的字段使用Solrj @Field注釋進(jìn)行注釋。 默認(rèn)情況下,Solrj嘗試將文檔字段名稱映射到同名的Solr字段。 Solr示例配置已經(jīng)定義了名為id,名稱和描述的Solr字段,因此不必將這些字段添加到Solr配置中。
如果要更改Solr字段定義,可以在<solr home> /example/solr/collection1/conf/schema.xml中找到示例配置文件。 在此文件中,您應(yīng)該找到以下字段定義:
<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"/>一般而言,書名比書名更好。 但是,通過使用名稱,我們可以使用默認(rèn)的Solr字段配置。 因此,出于簡單原因,我選擇名稱而不是標(biāo)題。
對(duì)于類別,我們必須使用@Field批注手動(dòng)定義字段名稱:Categories_txt。 這與Solr示例中名為* _txt的動(dòng)態(tài)字段匹配。 也可以在schema.xml中找到此字段定義:
<dynamicField?name="*_txt"?type="text_general"???indexed="true"??stored="true"?multiValued="true"/>創(chuàng)建一個(gè)倉庫
Spring Data使用存儲(chǔ)庫來簡化各種數(shù)據(jù)訪問技術(shù)的使用。 倉庫基本上是一個(gè)接口,其實(shí)現(xiàn)由Spring Data在應(yīng)用程序啟動(dòng)時(shí)動(dòng)態(tài)生成。 生成的實(shí)現(xiàn)基于存儲(chǔ)庫接口中使用的命名約定。 如果這是您的新手,建議閱讀使用Spring數(shù)據(jù)存儲(chǔ)庫 。
Spring Data Solr使用相同的方法。 我們?cè)诮涌趦?nèi)部使用命名約定和注釋來定義訪問Solr功能所需的方法。 我們從一個(gè)僅包含一種方法的簡單存儲(chǔ)庫開始(稍后將添加更多方法):
public?interface?BookRepository?extends?SolrCrudRepository<Book,?String>?{List<Book>?findByName(String?name);}通過擴(kuò)展SolrCrudRepository,我們可以在存儲(chǔ)庫中獲得一些常用方法,如save(),findAll(),delete()或count()。 使用接口方法findByName(String name)的定義,我們告訴Spring Data Solr創(chuàng)建一個(gè)方法實(shí)現(xiàn),該方法實(shí)現(xiàn)向Solr查詢書籍列表。 此列表中的書名應(yīng)與傳遞的參數(shù)匹配。
可以使用Spring的DI功能將存儲(chǔ)庫實(shí)現(xiàn)注入到其他類中。 在此示例中,我們將存儲(chǔ)庫注入到簡單的JUnit測試中:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes?=?Application.class,?loader=SpringApplicationContextLoader.class) public?class?BookRepositoryTests?{@Autowiredprivate?BookRepository?bookRepository;... }向Solr添加文檔
現(xiàn)在是時(shí)候向Solr添加一些書籍了。 使用我們的存儲(chǔ)庫,這是一項(xiàng)非常簡單的工作:
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);... }增加分頁并增強(qiáng)
假設(shè)我們有一個(gè)應(yīng)用程序,用戶可以在其中搜索書籍。 我們需要查找名稱或描述與用戶給出的搜索查詢相匹配的書籍。 出于性能原因,我們希望添加某種分頁功能,該分頁功能一次只能向用戶顯示10個(gè)搜索結(jié)果。
讓我們?cè)诖鎯?chǔ)庫界面中為此創(chuàng)建一個(gè)新方法:
Page<Book>?findByNameOrDescription(@Boost(2)?String?name,?String?description,?Pageable?pageable);方法名稱findByNameOrDescription告訴Spring Data Solr查詢名稱或描述與傳遞的參數(shù)匹配的書籍對(duì)象。 為了支持分頁,我們添加了Pageable參數(shù),并將返回類型從List <Book>更改為Page <Book>。 通過在名稱參數(shù)中添加@Boost批注,可以增強(qiáng)名稱與搜索參數(shù)匹配的書籍。 這是有道理的,因?yàn)檫@些書通常對(duì)用戶更感興趣。
如果現(xiàn)在我們要查詢包含10個(gè)元素的第一頁,我們只需要做:
Page<Book>?booksPage?=?bookRepository.findByNameOrDescription (searchString,?searchString,?new?PageRequest(0,?10));除前10個(gè)搜索結(jié)果外,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 ...刻面
每當(dāng)用戶搜索書名時(shí),我們都想向他顯示不同類別中有多少本書符合給定的查詢參數(shù)。 此功能稱為分面搜索 ,Spring Data Solr直接支持此功能。 我們只需要向存儲(chǔ)庫接口添加另一種方法:
@Query("name:?0") @Facet(fields?=?{?"categories_txt"?},?limit?=?5) FacetPage<Book>?findByNameAndFacetOnCategories(String?name,?Pageable?page);這次查詢將從@Query批注(包含Solr查詢)而不是方法名稱派生。 使用@Facet批注,我們告訴Spring Data Solr按類別對(duì)構(gòu)面進(jìn)行分類,并返回前五個(gè)構(gòu)面。
也可以刪除@Query批注并將方法名稱更改為findByName,以達(dá)到相同的效果。 這種方法的一個(gè)小缺點(diǎn)是,對(duì)于調(diào)用者來說,這種存儲(chǔ)庫方法確實(shí)可以執(zhí)行構(gòu)面操作,這一點(diǎn)并不明顯。 另外,方法簽名可能與其他按名稱搜索書籍的方法相沖突。
用法:
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());} }請(qǐng)注意,booksFacetPage.getAllFacets()返回FacetEntry頁面的集合。 這是因?yàn)?#64;Facet批注允許您一次對(duì)多個(gè)字段進(jìn)行構(gòu)面。 每個(gè)FacetPage最多包含 五個(gè)FacetEntries(由@Facet的limit屬性定義)。
突出顯示
通常,在搜索結(jié)果列表中突出顯示搜索查詢的出現(xiàn)很有用(例如,由google或bing來完成)。 這可以通過(Spring Data)Solr的突出顯示功能來實(shí)現(xiàn)。
讓我們添加另一個(gè)存儲(chǔ)庫方法:
@Highlight(prefix?=?"<highlight>",?postfix?=?"</highlight>") HighlightPage<Book>?findByDescription(String?description,?Pageable?pageable);@Highlight注釋告訴Solr突出顯示搜索到的描述的出現(xiàn)。
用法:
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}} }如果使用此存儲(chǔ)庫方法查詢描述包含字符串“ 金銀島”的書籍,則??摘要可能如下所示:
<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注釋中定義的前綴和后綴突出顯示。 當(dāng)向用戶顯示搜索結(jié)果時(shí),此附加標(biāo)記可用于標(biāo)記查詢的出現(xiàn)。
結(jié)論
Spring Data Solr提供了一種非常簡單的方法來將Solr集成到Spring應(yīng)用程序中。 使用存儲(chǔ)庫抽象,它遵循大多數(shù)其他Spring Data項(xiàng)目所做的相同設(shè)計(jì)原則。 我在使用Spring Data Solr時(shí)遇到的唯一小缺點(diǎn)是可以在此處和此處進(jìn)行改進(jìn)的文檔。
- 您可以在GitHub上找到此示例的完整源代碼。
翻譯自: https://www.javacodegeeks.com/2013/11/getting-started-with-spring-data-solr.html
總結(jié)
以上是生活随笔為你收集整理的Spring Data Solr入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旧电脑改车载(window改车载电脑)
- 下一篇: Spring交易可见性