javascript
Spring Data Solr教程:Solr简介
大多數應用程序必須具有某種搜索功能。 問題在于搜索功能通常是巨大的資源消耗,它們可能通過給數據庫造成沉重的負擔而破壞我們應用程序的性能。 因此,將負載轉移到外部搜索服務器是個好主意。
這是我的Spring Data Solr教程的第一部分。 在本教程中,我們將對todo應用程序實現搜索功能,這是我的Spring MVC Test教程的示例應用程序。
我們搜索功能的要求很簡單。 它必須返回一個待辦事項列表,其標題或說明包含使用的搜索詞。 搜索結果
頁面還必須提供指向用于查看待辦事項信息的頁面的鏈接。
在開始執行搜索功能之前,我們需要看一下Solr搜索服務器。 此博客條目為我們提供了有關Solr的基本信息,分為三個部分:
- 第一部分為我們簡要介紹了Solr及其數據模型。
- 第二部分描述了如何為Solr實例創建模式。
- 最后一部分描述了如何使用Solr提供的類似REST的HTTP API。
讓我們開始吧。
Solr簡介
首先讓我們簡要介紹一下Solr搜索服務器。 本簡介非常薄,僅提供我們需要了解的信息,以了解我們搜索功能的實現。
同樣,即使Solr嚴重依賴Lucene ,此博客條目也沒有區別。
本節介紹
- Solr搜索服務器的數據模型。
- 將新文檔添加到Solr后會發生什么。
- 對索引數據執行搜索查詢時會發生什么。
數據模型
索引由本質上是字段集合的文檔組成。 如果我們將此數據模型與關系數據庫的數據模型進行比較,則會發現以下相似之處:
- 索引與數據庫表大致相同。
- 文檔與數據庫表的一行相似。
- 字段的含義與數據庫表的列相同。
文檔的每個字段都可以被索引 , 存儲或兩者都被索引 。 這些術語的含義如下所述:
- 索引字段是可搜索和可排序的字段。 在搜索結果中不返回索引字段。
- 存儲的字段是在搜索結果中返回其值的字段。
- 如果一個字段既被索引又被存儲 ,則該字段既可搜索又可排序。 其值也會在搜索結果中返回。
向索引添加信息
將新文檔添加到Solr后,以不同的方式處理索引字段和存儲字段。 下面描述了這種差異:
- 索引字段經過分析階段,該階段通常將文本分解為單詞并對其應用不同的轉換。 該分析階段的結果將保存到Solr索引中。
- 存儲的字段的值按原樣保存。
從索引中搜索信息
搜索功能可分為以下三個步驟:
- 通常,搜索查詢所經歷的分析階段與索引字段相似。 這樣做的目的是確保搜索查詢與索引的內容匹配。
- Solr使用其索引執行搜索。
- 匹配的文檔以請求的格式返回。 每個文檔都包含其存儲字段的值。
創建模式
該架構用于配置以下內容:
- 文檔的字段。
- 將新文檔添加到索引時,如何處理文檔的字段。
- 對索引執行搜索時如何處理字段。
該模式是在名為schema.xml的文件中配置的,我們可以按照以下步驟為我們的應用程序創建模式:
在以下小節中將更詳細地描述這些步驟。 Solr實例的框架架構如下所示:
<?xml version="1.0" encoding="UTF-8" ?> <schema name="todo" version="1.5"><fields><!-- Configure fields here --></fields><!-- Configure unique key --><!-- Configure copy fields here --><types><!-- Configure field types here --></types> </schema>注意 :本節描述了我的博客條目“ 使用Maven運行Solr ”的示例應用程序的架構。
配置字段類型
字段類型指定以下內容:
- 字段的數據類型。
- 將信息添加到索引后如何對其進行分析。
- 從索引中搜索信息時如何處理信息。
我們可以使用fieldType元素配置字段類型。 下面描述了在我們的模式中使用的其屬性:
- name屬性說明字段類型的名稱。 它基本上是一個別名,用于聲明字段的類型。
- class屬性聲明實現所涉及字段類型的類。
- sortMissingLast屬性指定當缺少此字段的值時如何進行排序。 如果此屬性的值設置為“ true”,則最后返回在相關字段中沒有值的文檔。
- positionIncrementGap屬性聲明在同一文檔的多個字段之間放置的空白空間。 此屬性的值用于多值字段,其思想是防止跨不同字段的錯誤匹配。
- precisionStep屬性用于數字字段的范圍查詢。 通過閱讀NumericRangeQuery類的API文檔,我們可以獲得有關此信息的更多信息。
我們可以按照以下步驟配置架構的字段類型:
下面將更詳細地描述這些步驟。
配置長字段的字段類型
讓我們從為未在索引或搜索階段進行分析的長字段配置簡單字段類型開始。 我們可以按照以下步驟配置此字段類型:
我們的字段類型聲明如下所示:
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>配置字符串字段的字段類型
下一步是為在索引或搜索階段未分析的字符串字段配置簡單的字段類型。 我們可以按照以下步驟配置此字段類型:
我們的字符串字段的聲明如下所示:
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />為包含文本的字段配置字段類型
最后一步是配置text_general字段類型。 我們可以按照以下步驟進行操作:
text_general字段類型的聲明如下所示:
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"><!-- Configures the analysis done at the index phase --><analyzer type="index"><!-- Uses word break rules of the Unicode Text Segmentation algorith when splitting text into words. --><tokenizer class="solr.StandardTokenizerFactory"/><!-- Removes words found from stopwords.txt file. This filter is case insensitive. --><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /><!-- Transforms text to lower case --><filter class="solr.LowerCaseFilterFactory"/></analyzer><!-- Configures the analysis done at the query time --><analyzer type="query"><!-- Uses word break rules of the Unicode Text Segmentation algorith when splitting text into words. --><tokenizer class="solr.StandardTokenizerFactory"/><!-- Removes words found from stopwords.txt file. This filter is case insensitive. --><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /><!-- Applies synonyms found from the synonyms.txt file. --><filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/><!-- Transforms text to lower case --><filter class="solr.LowerCaseFilterFactory"/></analyzer> </fieldType>通過閱讀以下文檔,我們可以獲得有關分析階段的更多信息:
- 分析器,令牌生成器和令牌過濾器 。
配置文檔的字段
我們可以通過向schema.xml文件中添加字段元素來向文檔中添加新字段。 字段元素具有許多屬性,但是在這一點上,我們需要了解以下屬性的含義:
- name屬性指定字段的名稱。
- 索引屬性(true / false)指定是否將字段添加到搜索索引中。 只有索引字段是可搜索和可排序的。
- 存儲的屬性(true / false)指定是否應在搜索結果中返回該字段。
- multiValued (true / false)指定該字段是否可以在文檔中多次出現。
- type type屬性指定字段的類型。
- 必填項 (是/否)指定是否需要該字段。
為了最大程度地發揮Solr實例的性能,我們必須遵循以下準則:
- 我們不應存儲搜索結果中不需要的字段。
- 我們不應該為搜索功能未使用的字段建立索引。
通過閱讀以下文檔,我們可以獲得有關最佳現場配置的更多信息:
- 用例的字段選項
- Solr性能因素
現在,我們準備配置架構的實際字段。 讓我們先談談我們需要在搜索結果頁面上顯示的信息。 下面描述了此信息:
- 我們需要待辦事項條目的ID,用于創建指向視圖待辦事項條目頁面的鏈接。
- 我們需要待辦事項的標題,該標題用作已創建鏈接的錨文本。
當我們知道我們的應用程序必須能夠搜索待辦事項條目的標題和描述的內容時,可以按照以下步驟將所需字段添加到我們的模式中:
我們的字段聲明如下所示:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="title" type="text_general" indexed="true" stored="true" required=“true” multiValued="false"/> <field name="description" type="text_general" indexed="true" stored="false" multiValued="false"/> <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/> <field name="_version_" type="long" indexed="true" stored="true"/>配置復制字段
我們使用復制字段將標題和描述字段的內容復制到文本字段。 我們可以使用copyField元素配置復制字段。 我們可以按照以下步驟創建所需的配置:
我們的復制字段的聲明如下所示:
<copyField source="title" dest="text"/> <copyField source="description" dest="text"/>配置文檔的唯一鍵字段
唯一鍵是一個字段,該字段對于所有文檔都是唯一的。 指定文檔的唯一鍵不是強制性的,但是如果我們決定這樣做,則意味著索引不能包含在配置為唯一鍵的字段中具有相同值的兩個文檔。
在本例中,我們將字段“ id”用作文檔的唯一鍵。 我們可以通過將以下XML添加到schema.xml文件中來進行此配置:
<uniqueKey>id</uniqueKey>使用類似REST的HTTP API
Solr提供了類似REST的HTTP API,我們可以使用它來向Solr添加信息并針對其索引執行搜索查詢。 下面將描述這兩種用例。
注意 :本部分假定我們正在使用我的博客條目“ 運行Solr和Maven”的示例應用程序。
向Solr添加信息
我們可以按照以下步驟向Solr添加新信息:
我們的請求正文的內容如下:
[{"id":"1","title":"Write introduction to Solr","description":"This blog entry provides an introduction to Solr search server"},{"id":"2","title":"Implement example application","description":"This application demonstrates the usage of spring-data-solr."} ]現在,我們使用Solr提供的類似REST的API將兩個文檔添加到Solr索引中。
但是,很高興知道還有其他選項可以用來向Solr索引添加信息。 以下文檔中介紹了這些選項:
- POST JSON文檔
- 從數據庫導入記錄
- 從CSV文件加載數據
- 索引二進制文件
- 使用SolrJ
從Solr索引中搜索信息
現在,我們準備搜索存儲在Solr實例索引中的信息。 我們可以按照以下準則對Solr索引執行搜索查詢:
- 通過將GET請求發送到url'http:// localhost:8983 / solr / todo / select'來執行搜索查詢。
- 查詢字符串必須設置為q request參數的值。
- 查詢結果的格式必須設置為wt request參數的值。
讓我們繼續前進,找出如何列出從索引中找到的所有文檔,并對索引數據執行簡單的搜索查詢。
查找索引的所有文檔
我們可以按照以下步驟列出所有JSON格式的文檔:
當我們將GET請求發送到url'http:// localhost:8983 / solr / todo / select?q = *%3A *&wt = json'時,我們應該收到以下JSON:
{"responseHeader": {"status":0,"QTime":1,"params":{"wt":"json","q":"*:*"}},"response":{"numFound":2,"start":0,"docs":[{"id":"1","title":"Write introduction to Solr","_version_":1425949176574771200},{"id":"2","title":"Implement example application","_version_":1425949176662851584}]} }從索引中搜索信息
我們可以按照以下步驟搜索標題或描述中包含“申請”一詞的所有文檔:
當我們發送GET請求到URL'http:// localhost:8983 / solr / todo / select?q = application&wt = json'時,我們應該收到以下JSON:
{"responseHeader":{"status":0,"QTime":7,"params":{"wt":"json","q":"application"}},"response":{"numFound":1,"start":0,"docs":[{"id":"2","title":"Implement example application","_version_":1425949176662851584}]} }結束
現在,我們已經獲得了理解Spring Data Solr教程的下一部分中描述的概念所需的信息。 這篇博客文章教會了我們三件事:
- 我們了解Solr數據模型的基礎。
- 我們知道如何配置Solr實例的架構。
- 我們知道如何使用Solr的HTTP API將文檔添加到Solr索引并從中搜索信息。
翻譯自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-introduction-to-solr.html
總結
以上是生活随笔為你收集整理的Spring Data Solr教程:Solr简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些基于Java的AI框架:Encog,
- 下一篇: 使用Gradle的简单Spring MV