javascript
Spring Data Solr教程:动态查询
Solr通常被稱(chēng)為搜索服務(wù)器,我們可以在實(shí)現(xiàn)全文搜索功能時(shí)使用它。 但是,當(dāng)我們實(shí)現(xiàn)從搜索表單獲取其輸入的搜索功能時(shí),利用Solr的性能通常是明智的。
在這種情況下,執(zhí)行的搜索查詢(xún)?nèi)Q于收到的輸入。 這意味著查詢(xún)參數(shù)的數(shù)量取決于輸入到搜索表單的輸入。 換句話說(shuō),執(zhí)行的搜索查詢(xún)是動(dòng)態(tài)的。
我的Spring Data Solr教程的前一部分教我們?nèi)绾螌⒆远x方法添加到單個(gè)存儲(chǔ)庫(kù)。 現(xiàn)在該使用這些信息并了解如何使用Spring Data Solr創(chuàng)建動(dòng)態(tài)查詢(xún)。 讓我們開(kāi)始吧。
注意:這些博客條目提供了其他信息,可以幫助我們理解此博客文章中描述的概念:
- 使用Maven運(yùn)行Solr
- Spring Data Solr教程:Solr簡(jiǎn)介
- Spring Data Solr教程:配置
- Spring Data Solr教程CRUD(幾乎)
- Spring Data Solr教程:將自定義方法添加到單個(gè)存儲(chǔ)庫(kù)
創(chuàng)建動(dòng)態(tài)查詢(xún)
本節(jié)描述了如何使用Spring Data Solr創(chuàng)建動(dòng)態(tài)查詢(xún)。 它分為兩個(gè)小節(jié),如下所述:
- 第一部分描述了在開(kāi)始實(shí)際搜索功能之前需要了解的基礎(chǔ)知識(shí)。
- 第二部分描述了如何通過(guò)向Spring Data Solr存儲(chǔ)庫(kù)添加自定義方法來(lái)實(shí)現(xiàn)示例應(yīng)用程序的搜索功能。
學(xué)習(xí)基礎(chǔ)
在開(kāi)始實(shí)現(xiàn)示例應(yīng)用程序的搜索功能之前,我們需要知道如何使用Spring Data Solr“手動(dòng)”創(chuàng)建查詢(xún)。 我們可以按照以下步驟“手動(dòng)”創(chuàng)建查詢(xún):
下面將更詳細(xì)地描述這些步驟。
創(chuàng)建搜索條件
首先,我們必須為查詢(xún)創(chuàng)建搜索條件。 我們可以使用以下描述的條件類(lèi)來(lái)做到這一點(diǎn):
- org.springframework.data.solr.core.query.SimpleStringCriteria類(lèi)是基本條件類(lèi),用于通過(guò)使用已經(jīng)格式化的查詢(xún)字符串來(lái)指定執(zhí)行的查詢(xún)。 此類(lèi)中指定的查詢(xún)字符串按原樣執(zhí)行。 因此,此類(lèi)不能用于構(gòu)建動(dòng)態(tài)查詢(xún)。
- org.springframework.data.solr.core.query.Criteria是用于構(gòu)建動(dòng)態(tài)查詢(xún)的條件類(lèi)。 它具有流暢的API,該API支持多個(gè)Criteria對(duì)象的鏈接。
創(chuàng)建執(zhí)行的查詢(xún)
其次,我們必須創(chuàng)建執(zhí)行的查詢(xún)。 下面介紹Spring Data Solr的查詢(xún)類(lèi):
- org.springframework.data.solr.core.query.SimpleQuery類(lèi)是一個(gè)支持分頁(yè)和分組的查詢(xún)類(lèi)。
- org.springframework.data.solr.core.query.SimpleFacetQuery類(lèi)是支持多面搜索的查詢(xún)類(lèi)。
- org.springframework.data.solr.core.query.SimpleFilterQuery類(lèi)是支持過(guò)濾器查詢(xún)的查詢(xún)類(lèi)。
執(zhí)行創(chuàng)建的查詢(xún)
第三,我們必須執(zhí)行創(chuàng)建的查詢(xún)。 SolrTemplate類(lèi)實(shí)現(xiàn)了一些可用于此目的的方法。 下面介紹了這些方法:
- long count(最終SolrDataQuery查詢(xún))方法返回使用作為方法參數(shù)給出的查詢(xún)找到的文檔數(shù)。
- UpdateResponse delete(SolrDataQuery query)方法刪除與作為方法參數(shù)給出的查詢(xún)匹配的文檔,并返回一個(gè)UpdateResponse對(duì)象。
- T queryForObject(Query query,Class <T> clazz)方法返回與作為方法參數(shù)給出的查詢(xún)匹配的單個(gè)文檔。
- FacetPage <T> queryForFacetPage(FacetQuery query,Class <T> clazz)方法針對(duì)Solr索引執(zhí)行構(gòu)面查詢(xún),并將查詢(xún)結(jié)果作為FacetPage對(duì)象返回。
- Page <T> queryForPage(Query query,Class <T> clazz)方法對(duì)Solr索引執(zhí)行查詢(xún),并作為Page接口的實(shí)現(xiàn)返回查詢(xún)結(jié)果。
讓我們繼續(xù)實(shí)踐該理論。
實(shí)現(xiàn)搜索功能
我們的搜索功能的要求如下:
- 搜索功能必須返回名稱(chēng)或描述包含給定搜索詞的某些單詞的所有待辦事項(xiàng)。 換句話說(shuō),如果搜索詞是“ Foo Bar”,則我們的搜索功能必須返回標(biāo)題或描述包含“ Foo”或“ Bar”的待辦事項(xiàng)條目。
- 搜索必須不區(qū)分大小寫(xiě)。
因?yàn)槲覀兊乃阉鞴δ懿皇庆o態(tài)的,所以我們必須使用動(dòng)態(tài)查詢(xún)來(lái)創(chuàng)建它。 我們可以通過(guò)在Spring Data Solr存儲(chǔ)庫(kù)中添加自定義方法來(lái)使用Spring Data Solr創(chuàng)建動(dòng)態(tài)查詢(xún)。 換句話說(shuō),我們必須遵循以下步驟:
下面將更詳細(xì)地描述這些步驟。
創(chuàng)建自定義界面
首先,我們必須創(chuàng)建一個(gè)自定義接口,該接口聲明我們的自定義搜索方法。 我們可以按照以下步驟進(jìn)行操作:
CustomTodoDocumentRepository接口的源代碼如下所示:
public interface CustomTodoDocumentRepository {public List<TodoDocument> search(String searchTerm);//Other methods are omitted. }實(shí)施創(chuàng)建的接口
其次,我們必須實(shí)現(xiàn)我們之前創(chuàng)建的自定義接口。 我們可以按照以下步驟進(jìn)行操作:
search()方法的實(shí)現(xiàn)需要在此給出更詳細(xì)的描述。 我們可以通過(guò)執(zhí)行以下步驟來(lái)實(shí)現(xiàn)search()方法:
TodoDocumentRepositoryImpl類(lèi)的源代碼如下所示:
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 }修改存儲(chǔ)庫(kù)界面
第三,我們必須使我們的自定義search()方法對(duì)存儲(chǔ)庫(kù)的用戶可見(jiàn)。 我們可以通過(guò)擴(kuò)展CustomTodoDocumentRepository接口來(lái)實(shí)現(xiàn)。 TodoDocumentRepository接口的源代碼如下所示:
import org.springframework.data.solr.repository.SolrCrudRepository;public interface TodoDocumentRepository extends CustomTodoDocumentRepository, SolrCrudRepository<TodoDocument, String> {}現(xiàn)在,我們向Spring Data Solr存儲(chǔ)庫(kù)添加了一個(gè)自定義search()方法。 讓我們找出如何使用此方法。
使用自定義方法
我們可以通過(guò)修改RepositoryTodoIndexService類(lèi)的search()方法來(lái)使用自定義方法。 此方法的新實(shí)現(xiàn)非常簡(jiǎn)單。 它通過(guò)調(diào)用我們的Spring Data Solr存儲(chǔ)庫(kù)的search()方法獲取搜索結(jié)果,并返回搜索結(jié)果。
RepositoryTodoIndexService類(lèi)的源代碼如下所示:
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);} }摘要
現(xiàn)在,我們已經(jīng)使用Spring Data Solr實(shí)現(xiàn)了動(dòng)態(tài)搜索功能。 盡管我們的搜索功能非常簡(jiǎn)單,但是我們現(xiàn)在也應(yīng)該能夠?qū)崿F(xiàn)更復(fù)雜的查詢(xún)。
本教程教了我們兩件事:
- 我們學(xué)習(xí)了如何使用Spring Data Solr“手動(dòng)”創(chuàng)建查詢(xún)。
- 我們了解到,必須通過(guò)向單個(gè)存儲(chǔ)庫(kù)添加自定義方法來(lái)實(shí)現(xiàn)動(dòng)態(tài)搜索方法。
我的Spring Data Solr教程的下一部分描述了如何對(duì)查詢(xún)結(jié)果進(jìn)行排序。
PS此博客文章的示例應(yīng)用程序可在Github上獲得 。
翻譯自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-dynamic-queries.html
總結(jié)
以上是生活随笔為你收集整理的Spring Data Solr教程:动态查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 腾讯混元大模型已开始内测 近期将正式对外
- 下一篇: Spring Web应用程序的最大缺陷