利用solr实现商品的搜索功能
生活随笔
收集整理的這篇文章主要介紹了
利用solr实现商品的搜索功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么要用solr服務,為什么要用luncence?問題提出:當我們訪問購物網站的時候,我們可以根據我們隨意所想的內容輸入關鍵字就可以查詢出相關的
內容,這是怎么做到呢?這些隨意的數據不可能是根據數據庫的字段查詢的,那是怎么查詢出來的呢,為什么
千奇百怪的關鍵字都可以查詢出來呢?答案就是全文檢索工具的實現,luncence采用了詞元匹配和切分詞。所以我們搜索的時候都可以檢索到。有一種分詞器就是IKAnalyzer中文分詞器,它有細粒度切分和智能切分,即根據某種智能算法。這就使用solr的最大的好處:檢索功能的實現。(1)solr服務器搭建,因為solr是用java5開發的,所以需要jdk和tomcat。搭建部署
(2)搭建完成后,我們需要將要展示的字段引入solr的庫中。配置spring與solr結合,工程啟動的時候
啟動solr
(3)將數據庫中的查詢內容導入到solr索引庫,這里使用的是solrj的客戶端實現的。具體使用可以參考api
(4)建立搜索服務,供客戶端調用。調用solr,查詢內容,這中間有分頁功能的實現。solr高亮顯示的實現。
(5)客戶端接收頁面的請求參數,調用搜索服務,進行搜索。1、在搜索時是否需要在此字段上進行搜索。例如:商品名稱、商品的賣點、商品的描述
(這些相當于將標簽給了solr,導入商品數據后,solr對這些字段的對應的商品的具體內容進行分詞切分,
然后,我們就可以搜索到相關內容了)需要用到的字段:1、商品id2、商品title3、賣點4、價格5、商品圖片6、商品分類名稱7、商品描述Solr中的業務字段:1、id——》商品id其他的對應字段創建solr的字段。<field name="item_title" type="text_ik" indexed="true" stored="true"/><field name="item_sell_point" type="text_ik" indexed="true" stored="true"/><field name="item_price"? type="long" indexed="true" stored="true"/><field name="item_image" type="string" indexed="false" stored="true" /><field name="item_category_name" type="string" indexed="true" stored="true" /><field name="item_desc" type="text_ik" indexed="true" stored="false" /><field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/><copyField source="item_title" dest="item_keywords"/><copyField source="item_sell_point" dest="item_keywords"/><copyField source="item_category_name" dest="item_keywords"/><copyField source="item_desc" dest="item_keywords"/>重新啟動tomcatSolr 是Apache下的一個頂級開源項目,采用Java開發,它是基于Lucene的全文搜索服務器。Solr提供了
比Lucene更為豐富的查詢語言,同時實現了可配置、可擴展,并對索引、搜索性能進行了優化。Solr是一個全文檢索服務器,只需要進行配置就可以實現全文檢索服務。有效降低頻繁訪問數據庫對數據庫
造成的壓力。第一步:將solr部署在linux系統下。
第二步:solrJ是solr的客戶端,使用它需要依賴solrJ的jar包。
第三步:將數據庫的內容添加到solr的索引庫,這樣查詢就在索引庫查詢,而不是數據庫了。controller層:@Controller
@RequestMapping("/manager")
public?class?ItemController {@Autowiredprivate?ItemService itemService;@RequestMapping("/importall")@ResponseBodypublic???TaotaoResult importAllItem(){TaotaoResult result= itemService.importAllItem();return?result;}
}public interface ItemMapper {List<item> getItemList();}mapper.xml<?xml version="1.0"?encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC?"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"?>
<mapper namespace="com.taotao.search.mapper.ItemMapper">
<select id="getItemList"?resultType="com.taotao.search.pojo.Item">SELECTa.id,a.title,a.sell_point,a.price,a.image,b. NAME category_nameFROMtb_item aLEFT JOIN tb_item_cat b ON a.cid = b.id
</select>
</mapper>
第四步:從索引庫查詢的邏輯編寫://從索引庫里面獲取商品信息,現在這個dao層是從索引庫獲取信息,因為之前的寫的邏輯是將db里面的數據
導入到索引庫。后面的查詢都是從索引庫中進行,而不從數據庫了
@Repository
public?class?SearchDaoImpl?implements?SearchDao {@Autowiredprivate?SolrServer solrServer;@Overridepublic?SearchResult search(SolrQuery query)?throws?Exception {//這是從索引庫里面,直接執行查詢QueryResponse response = solrServer.query(query);//獲取查詢的結果SolrDocumentList documentList= response.getResults();SearchResult result=new?SearchResult();//這是獲取總記錄數result.setRecordCount(documentList.getNumFound());List<Item> itemList=new?ArrayList<>();//商品的高亮顯示,即當鼠標移到字上時,該字體變色,這是從QueryResponse中獲取的Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();for?(SolrDocument solrDocument : documentList) {//每個SolrDocument都是一個商品pojo的內容,所以這里要創建一個商品的pojo對象,來
獲取詳細的字段Item item=new?Item();item.setId((String) solrDocument.get("id"));//高亮顯示是title的高亮顯示List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");String title="";if?(list!=null?&& list.size()>0) {title=list.get(0);?}else{title=(String) solrDocument.get("item_title");?}item.setTitle(title);item.setPrice((Long) solrDocument.get("item_price"));item.setImage((String) solrDocument.get("item_image"));item.setCategory_name((String) solrDocument.get(" item_category_name"));item.setSell_point((String) solrDocument.get("item_sell_point"));itemList.add(item);}result.setItemList(itemList);return?result;}}
Lucene和Solr和Elasticsearch的區別
LuceneLucene是apache下的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索 引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。 官網地址:https://lucene.apache.org/ElasticsearchElasticsearch跟Solr一樣,也是一個基于Lucene的搜索服務器,它提供了一個分布式多用戶能力的全文搜索 引擎,基于RESTful web接口。官網地址:https://www.elastic.co/products/elasticsearch1、Elasticsearch的優缺點:優點:1.Elasticsearch是分布式的。不需要其他組件,分發是實時的,被叫做”Push replication”。2.Elasticsearch 完全支持 Apache Lucene 的接近實時的搜索。3.處理多租戶(multitenancy)不需要特殊配置,而Solr則需要更多的高級設置。4.Elasticsearch 采用 Gateway 的概念,使得完備份更加簡單。5.各節點組成對等的網絡結構,某些節點出現故障時會自動分配其他節點代替其進行工作。缺點:1.只有一名開發者(當前Elasticsearch GitHub組織已經不只如此,已經有了相當活躍的維護者)2.還不夠自動(不適合當前新的Index Warmup API)2、Solr的優缺點:優點1.Solr有一個更大、更成熟的用戶、開發和貢獻者社區。2.支持添加多種格式的索引,如:HTML、PDF、微軟 Office 系列軟件格式以及 JSON、XML、CSV 等純文本 格式。3.Solr比較成熟、穩定。4.不考慮建索引的同時進行搜索,速度更快。缺點1.建立索引時,搜索效率下降,實時索引搜索效率不高。3、Elasticsearch 與 Solr 的比較:1.二者安裝都很簡單;2.Solr 利用 Zookeeper 進行分布式管理,而 Elasticsearch 自身帶有分布式協調管理功能;3.Solr 支持更多格式的數據,而 Elasticsearch 僅支持json文件格式;4.Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高級功能多有第三方插件提供;5.Solr 在傳統的搜索應用中表現好于 Elasticsearch,但在處理實時搜索應用時效率明顯 低于 Elasticsearch。5.Solr 在傳統的搜索應用中表現好于 Elasticsearch,但在處理實時搜索應用時效率明顯 低于 Elasticsearch。使用案例:1.維基百科使用Elasticsearch來進行全文搜做并高亮顯示關鍵詞,以及提供search-as-you-type、 did-you-mean等搜索建議功能。2.英國衛報使用Elasticsearch來處理訪客日志,以便能將公眾對不同文章的反應實時地反饋給各位編輯。3.StackOverflow將全文搜索與地理位置和相關信息進行結合,以提供more-like-this相關問題的展現。4.GitHub使用Elasticsearch來檢索超過1300億行代碼。5.每天,Goldman Sachs使用它來處理5TB數據的索引,還有很多投行使用它來分析股票市場的變動。solr如何實現搜索的?倒排索引,先抽取文檔中詞,并建立詞與文檔id的映射關系,然后查詢的時候會根據詞去查詢文檔id, 并查詢出文檔Solr過濾器Solr的過濾器對接收到的標記流(TokenStream )做額外的處理過濾查詢,在查詢時設置Solr原理Solr是基于Lucene開發的全文檢索服務器,而Lucene就是一套實現了全文檢索的api,其本質就是一個全文 檢索的過程。全文檢索就是把原始文檔根據一定的規則拆分成若干個關鍵詞,然后根據關鍵詞創建索引,當查詢時先查詢 索引找到對應的關鍵詞,并根據關鍵詞找到對應的文檔,也就是查詢結果,最終把查詢結果展示給用戶的過程Solr基于什么基于lucene搜索庫的一個搜索引擎框架,lucene是一個開放源碼的全文檢索引擎工具包IK分詞器原理本質上是詞典分詞,在內存中初始化一個詞典,然后在分詞過程中逐個讀取字符,和字典中的字符相匹配, 把文檔中的所有詞語拆分出來的過程solr的索引查詢為什么比數據庫要快Solr使用的是Lucene API實現的全文檢索。全文檢索本質上是查詢的索引。而數據庫中并不是所有的字段 都建立的索引,更何況如果使用like查詢時很大的可能是不使用索引,所以使用solr查詢時要比查數據庫快solr索引庫個別數據索引丟失怎么辦首先Solr是不會丟失個別數據的。如果索引庫中缺少數據,那就向索引庫中添加Lucene索引優化直接使用Lucene實現全文檢索已經是過時的方案,推薦使用solr。Solr已經提供了完整的全文檢索解決方案solr如何分詞,新增詞和禁用詞如何解決新增詞添加到詞典配置文件中ext.dic,禁用詞添加到禁用詞典配置文件中stopword.dic,然后在 schema.xml文件中配置禁用詞典:<filter class="solr.StopFilterFactory" ignore="true" words="/禁止詞文件目錄"/>ElasticSearch(簡稱ES)是一個分布式、Restful的搜索及分析服務器,設計用于分布式計算;能夠達到 實時搜索,穩定,可靠,快速。和Apache Solr一樣,它也是基于Lucence的索引服務器, 而ElasticSearch對比Solr的優點在于: 1.輕量級:安裝啟動方便,下載文件之后一條命令就可以啟動。 2.Schema free:可以向服務器提交任意結構的JSON對象,Solr中使用schema.xml指定了索引結構。 3.多索引文件支持:使用不同的index參數就能創建另一個索引文件,Solr中需要另行配置。 4.分布式:Solr Cloud的配置比較復雜。lucence 內部結構是什么1.索引(Index): 在Lucene中一個索引是放在一個文件夾中的。2.段(Segment): 一個索引可以包含多個段,段與段之間是獨立的,添加新文檔可以生成新的段, 不同的段可以合并。3.文檔(Document): 文檔是我們建索引的基本單位,不同的文檔是保存在不同的段中的,一個段可以包含 多篇文檔。4.域(Field):一篇文檔包含不同類型的信息,可以分開索引,比如標題,時間,正文,作者等,都可以 保存在不同的域里。 5.詞(Term):詞是索引的最小單位,是經過詞法分析和語言處理后的字符串。solr和lucene的區別1.Solr和Lucene的本質區別有以下三點:搜索服務器,企業級和管理。Lucene本質上是搜索庫,不是獨立的 應用程序,而Solr是。2.Lucene專注于搜索底層的建設,而Solr專注于企業應用。3.Lucene不負責支撐搜索服務所必須的管理,而Solr負責。4.Lucene: 是一個索引與搜索類庫,而不是完整的程序。5.Solr:是一個高性能,采用Java5開發,基于Lucene的一個獨立的企業級搜索應用服務器,它對外提供 類似于Web-service的API接口。solr 實現全文檢索1.索引流程:客戶端---》solr 服務器(發送post請求,xml文檔包含filed,solr實現對索引的維護)2.搜索流程:客戶端---》solr 服務器(發送get 請求,服務器返回一個xml 文檔)solr和lucene之間的區別1.lucene全文檢索的工具包,jar包2.solr 全文檢索服務器,單獨運行的servlet容器?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的利用solr实现商品的搜索功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异常注意事项_子父类异常
- 下一篇: 自定义异常类的练习