Solr 是Apache下的一個頂級開源項目,採用Java開發,它是基於Lucene的全文搜索服務。Solr能夠獨立運行在Jetty、Tomcat等這些Servlet容器中。都是Web服務器,Servlet容器,報文 ,JSON 格式字符串, XML格式字符串。Solr是一個能夠獨立運行的搜索服務器,使用solr進行全文檢索服務的話,只須要經過http請求訪問該服務器便可。java
使用Solr 進行建立索引和搜索索引的實現方法很簡單,以下:node
Lucene是一個開放源代碼的全文檢索引擎工具包,它不是一個完整的全文檢索應用。Lucene僅提供了完整的查詢引擎和索引引擎,目的是爲軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者以Lucene爲基礎構建全文檢索應用。apache
Solr的目標是打造一款企業級的搜索引擎系統,它是基於Lucene一個搜索引擎服務,能夠獨立運行,經過Solr能夠很是快速的構建企業的搜索引擎,經過Solr也能夠高效的完成站內搜索功能。json
概念:HttpSolrServer瀏覽器
概念:SolrCloud(solr 雲)是Solr提供的分佈式搜索方案,當你須要大規模,容錯,分佈式索引和檢索能力時使用 SolrCloud。當一個系統的索引數據量少的時候是不須要使用SolrCloud的,當索引量很大,搜索請求併發很高,這時須要使用SolrCloud來知足這些需求。服務器
結構:SolrCloud爲了下降單機的處理壓力,須要由多臺服務器共同來完成索引和搜索任務。實現的思路是將索引數據進行Shard(分片)拆分,每一個分片由多臺的服務器共同完成,當一個索引或搜索請求過來時會分別從不一樣的Shard的服務器中操做索引。SolrCloud須要Solr基於Zookeeper部署,Zookeeper是一個集羣管理軟件,因爲SolrCloud須要由多臺服務器組成,由zookeeper來進行協調管理。併發
package com.xyg.solrj; import java.util.List; import java.util.Map; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.ORDER; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.junit.Test; /** * <p>Title:SolrjDemo</p> * @Description:solrj的入門程序 * @Param: * @Return: * @Author:Administrator * @Date:2017年11月3日上午12:32:42 */ public class SolrjDemo { //添加 修改 @Test public void testCreateAndUpdateIndex() throws Exception { // 1. 建立HttpSolrServer對象 // 設置solr服務接口,瀏覽器客戶端地址http://127.0.0.1:8080/solr/#/ String baseURL = "http://127.0.0.1:8080/solr"; //String baseURL = "http://localhost:8080/solr/collection2"; SolrServer solrServer = new HttpSolrServer(baseURL); // 2. 建立SolrInputDocument對象 SolrInputDocument document = new SolrInputDocument(); document.addField("id", "100"); document.addField("name", "Hello world!"); // 3. 把SolrInputDocument對象添加到索引庫中 solrServer.add(document); //httpSolrServer.add(document,1000); // 4. 提交 solrServer.commit(); } //刪除 @Test public void testDeleteIndex() throws Exception { String baseURL = "http://127.0.0.1:8080/solr"; SolrServer solrServer = new HttpSolrServer(baseURL); // 根據id刪除索引數據 //solrServer.deleteById("100"); // 根據條件刪除(若是是*:*就表示所有刪除,慎用) //solrServer.deleteByQuery("name:Hello"); solrServer.deleteByQuery("*:*"); //刪除全部 solrServer.commit(); // 提交 } //查詢 @Test public void testSearchIndex1() throws Exception { String baseURL = "http://127.0.0.1:8080/solr"; SolrServer solrServer = new HttpSolrServer(baseURL); // 建立搜索對象 SolrQuery query = new SolrQuery(); // 設置搜索條件 query.setQuery("*:*"); // 發起搜索請求 QueryResponse response = solrServer.query(query); // 處理搜索結果 SolrDocumentList docs = response.getResults(); System.out.println("搜索到的結果總數:" + docs.getNumFound()); // 遍歷搜索結果 for (SolrDocument doc : docs) { System.out.println("----------------------------------------------------"); System.out.println("id:" + doc.get("id")); System.out.println("name:" + doc.get("name")); } } //複雜查詢索引 @Test public void queryIndex2() throws Exception { //建立鏈接 SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr"); //建立一個query對象 SolrQuery solrQuery = new SolrQuery(); //設置關鍵詞查詢條件 solrQuery.setQuery("鑽石"); //solrQuery.set("q","鑽石"); //過濾條件 solrQuery.setFilterQueries("product_catalog_name:幽默雜貨"); //排序條件 solrQuery.setSort("product_price", ORDER.asc); //分頁處理 solrQuery.setStart(0); solrQuery.setRows(10); //結果中域的列表 solrQuery.setFields("id","product_name","product_price","product_catalog_name","product_picture"); //設置默認搜索域 solrQuery.set("df", "product_keywords"); //高亮顯示 solrQuery.setHighlight(true); //高亮顯示的域 solrQuery.addHighlightField("product_name"); //高亮顯示的前綴 solrQuery.setHighlightSimplePre("<font color='red'>"); //高亮顯示的後綴 solrQuery.setHighlightSimplePost("</font>"); //執行查詢 QueryResponse queryResponse = solrServer.query(solrQuery); //取查詢結果 SolrDocumentList solrDocumentList = queryResponse.getResults(); //共查詢到商品數量 System.out.println("共查詢到商品數量:" + solrDocumentList.getNumFound()); //遍歷查詢的結果 for (SolrDocument solrDocument : solrDocumentList) { System.out.println(solrDocument.get("id")); //取高亮顯示 String productName = ""; Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting(); List<String> list = highlighting.get(solrDocument.get("id")).get("product_name"); //判斷是否有高亮內容 if (null != list) { productName = list.get(0); } else { productName = (String) solrDocument.get("product_name"); } System.out.println(productName); System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_catalog_name")); System.out.println(solrDocument.get("product_picture")); } } }