1. solr中關鍵對象,參數或配置文件java
關鍵字: solrHome,分詞器web
配置文件: schema.xml:配置字段,字段類型算法
web.xml:配置solrHme的位置spring
客戶端: solrJ數據庫
對象: solrServer,SolrQueryapache
2. solr的維護:app
2.1 solr中中維護包括增,刪,改,查,注意solr中沒有修改ide
(1) 向solr 庫中添加: public void addDocument() throws Exception { //建立一鏈接 SolrServer solrServer = new HttpSolrServer("http://192.168.254.130:8080/solr"); //建立一個文檔對象 SolrInputDocument document = new SolrInputDocument(); document.addField("id", "test001"); document.addField("item_title", "測試商品2"); document.addField("item_price", 54321); //把文檔對象寫入索引庫 solrServer.add(document); //提交 solrServer.commit(); } (2) 更新: 添加一個id值同樣的,就將原來的更新了: public void addDocument() throws Exception { //建立一鏈接 SolrServer solrServer = new HttpSolrServer("http://192.168.254.130:8080/solr"); //建立一個文檔對象 SolrInputDocument document = new SolrInputDocument(); document.addField("id", "test001"); document.addField("item_title", "測試商品3"); document.addField("item_price", 1233333); //把文檔對象寫入索引庫 solrServer.add(document); //提交 solrServer.commit(); } (3)刪除: public void deleteDocument() throws Exception { //建立一鏈接 SolrServer solrServer = new HttpSolrServer("http://192.168.254.130:8080/solr"); //solrServer.deleteById("test001"); solrServer.deleteByQuery("*:*"); solrServer.commit(); } (4)查詢: public void queryDocument() throws Exception { SolrServer solrServer = new HttpSolrServer("http://192.168.254.130:8080/solr"); //建立一個查詢對象 SolrQuery query = new SolrQuery(); //設置查詢條件 query.setQuery("*:*"); query.setStart(20); query.setRows(50); //執行查詢 QueryResponse response = solrServer.query(query); //取查詢結果 SolrDocumentList solrDocumentList = response.getResults(); System.out.println("共查詢到記錄:" + solrDocumentList.getNumFound()); for (SolrDocument solrDocument : solrDocumentList) { System.out.println(solrDocument.get("id")); System.out.println(solrDocument.get("item_title")); System.out.println(solrDocument.get("item_price")); System.out.println(solrDocument.get("item_image")); } }
2.2 與spring的整合例子在: taotao-search中 ItemServiceImpl 測試
添加例子ui
@Service public class ItemServiceImpl implements ItemService{ @Resource private ItemMapper itemMapper; @Resource private SolrServer solrServer; @Override public TaotaoResult importAllItems() { //從數據庫中查出商品列表 List<Item> list = itemMapper.getItemList(); //將list中的數據導入到 solr中 try { for(Item item:list){ //建立一個文檔對象 SolrInputDocument document = new SolrInputDocument(); document.addField("id", item.getId()); document.addField("item_title", item.getTitle()); document.addField("item_sell_point", item.getSell_point()); document.addField("item_price", item.getPrice()); document.addField("item_image", item.getImage()); document.addField("item_category_name", item.getCategory_name()); //把文檔對象寫入索引庫 solrServer.add(document); } solrServer.commit(); return TaotaoResult.ok(); } catch (Exception e) { e.printStackTrace(); return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e)); } } }
查詢例子:
package com.taotao.search.service.impl; import javax.annotation.Resource; import org.apache.solr.client.solrj.SolrQuery; import org.springframework.stereotype.Service; import com.taotao.search.dao.SearchDao; import com.taotao.search.pojo.SearchResult; import com.taotao.search.service.SearchService; @Service public class SearchServiceImpl implements SearchService { @Resource private SearchDao searchDao; @Override public SearchResult search(String queryString, int page, int rows) throws Exception { // 建立查詢對象 SolrQuery query = new SolrQuery(); // 設置查詢條件 query.setQuery(queryString); // 設置分頁 query.setStart((page - 1) * rows); query.setRows(rows); // 設置默認搜素域 query.set("df", "item_keywords"); // 設置高亮顯示 query.setHighlight(true); query.addHighlightField("item_title"); query.setHighlightSimplePre("<em style=\"color:red\">"); query.setHighlightSimplePost("</em>"); // 執行查詢 SearchResult searchResult = searchDao.search(query); // 計算查詢結果總頁數 long recordCount = searchResult.getRecordCount(); //算法:若是總行數不能被每頁行數整除,則在顯示頁面上加1 long pageCount = recordCount / rows; if (recordCount % rows > 0) { pageCount++; } searchResult.setPageCount(pageCount); searchResult.setCurPage(page); return searchResult; } }
依賴的searchDao代碼爲:
package com.taotao.search.dao.impl; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.taotao.search.dao.SearchDao; import com.taotao.search.pojo.Item; import com.taotao.search.pojo.SearchResult; /** * 商品搜索Dao * <p>Title: SearchDaoImpl</p> * <p>Description: </p> * <p>Company: </p> * @author 楊凱 * @date 2015年9月11日下午3:26:25 * @version 1.0 */ @Repository public class SearchDaoImpl implements SearchDao { @Autowired private SolrServer solrServer; @Override public SearchResult search(SolrQuery query) throws Exception { //返回值對象 SearchResult result = new SearchResult(); //根據查詢條件查詢索引庫 QueryResponse queryResponse = solrServer.query(query); //取查詢結果 SolrDocumentList solrDocumentList = queryResponse.getResults(); //取查詢結果總數量 result.setRecordCount(solrDocumentList.getNumFound()); //商品列表 List<Item> itemList = new ArrayList<>(); //取高亮顯示 Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting(); //取商品列表 for (SolrDocument solrDocument : solrDocumentList) { //建立一商品對象 Item item = new Item(); item.setId(Long.parseLong((String)solrDocument.get("id")) ); //取高亮顯示的結果 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.setImage((String) solrDocument.get("item_image")); item.setPrice((long) solrDocument.get("item_price")); //設置賣點 item.setSell_point((String) solrDocument.get("item_sell_point")); //商品分類 item.setCategory_name((String) solrDocument.get("item_category_name")); //添加的商品列表 itemList.add(item); } result.setItemList(itemList); return result; } }