Solr的安装和使用
安裝
CentOS中先安裝好Java和Tomcat。準備工具IK Analyzer 2012FF
和Solr-4.10.3.tgz
將solr-4.10.3文件夾中dist中的solr-4.10.3.war文件復制到Tomcat的webapps,并且更名為solr.war,下開啟tomcat解壓后再關閉tomcat,再刪除solr.war。
將Solr-4.10.3文件中,example/lib/ext下所有jar包復制到tomcat/webapps/solr/WEB-INF/lib文件夾下。
在你愿意的位置創建一個目錄叫solrhome,把Solr-4.10.3 /example下solr復制到 solrhome中,然后在solr的WEB-INF下的web.xml中配置solrhome的位置。
<env-entry><env-entry-name>solr/home</env-entry-name><env-entry-value>/usr/local/solr/solrhome</env-entry-value><env-entry-type>java.lang.String</env-entry-type></env-entry>?
配置業務字段
?
把IK_Analyzer 2012文件夾下的IKAnalyzer2012FF_u1的jar包復制到solr 的WEB-INF下lib文件夾中。
在WEB-INF下新建classes文件夾。復制如下三個文件到classes中
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes?
修改solrhome/collection1/conf/schema.xml文件,在末尾添加
<fieldType name="text_ik" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> <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"/>重啟tomcat
簡單測試
打開solr網址,http://192.168.140.133:8080/solr/,點擊左側collection1,選擇Documents
在documents中輸入
點擊Submit Document
?點擊Collection1下的Query,點擊Execute Query
?
刪除該測試文檔,
在Documents輸入
<delete> <query>*:*</query> </delete> <commit/>Document Type選擇xml,然后Submmit Document。
再Execute Query就沒有文檔了。
},"response": {"numFound": 0,"start": 0,"docs": []} }?使用Java代碼來測試solr文檔
添加SolrJava客戶端依賴
<!-- solr客戶端 --><dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId></dependency>測試代碼
public class SolrJTest {@Testpublic void addDocument() throws Exception {//創建一連接SolrServer solrServer = new HttpSolrServer("http://192.168.25.154: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();}@Testpublic void deleteDocument() throws Exception {//創建一連接SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");//solrServer.deleteById("test001");solrServer.deleteByQuery("*:*");solrServer.commit();} }使用Java代碼將MySQL數據上傳到Solr服務器
使用Http方式,訪問http://localhost/search/import的時候,將后臺MySQL幾個表的數據上傳到Solr服務器。
先看Controller
@Controller public class SearchController {@Autowiredprivate ImportItemService importItemService;@RequestMapping("/search/import")@ResponseBodypublic TaotaoResult importAll() {TaotaoResult result = importItemService.importAll();return result;}Service層總ImportItemService的實現類是
@Service public class ImportItemServiceImpl implements ImportItemService {@Autowiredprivate ImportItemMapper iim;@Autowiredprivate SolrServer solrServer;@Overridepublic TaotaoResult importAll(){try {List<ImportItem> list = iim.importItemList();for(ImportItem item:list) {SolrInputDocument document= new SolrInputDocument();document.setField("id", item.getId());document.setField("item_title", item.getTitle());document.setField("item_sell_point", item.getSell_point());document.setField("item_price", item.getPrice());document.setField("item_image", item.getImage());document.setField("item_category_name", item.getCategory_name());document.setField("item_desc", item.getItem_des());//寫入索引庫 solrServer.add(document);}solrServer.commit();} catch (Exception e) {e.printStackTrace();return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));}return TaotaoResult.ok();}}其中ImportItem類
public class ImportItem { //getter and setter... ...private String id;private String title;private String sell_point;private long price;private String image;private String category_name;private String item_des;}?
DAO 層
public interface ImportItemMapper {List<ImportItem> importItemList(); }對應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.mapper.ImportItemMapper" ><select id="importItemList" resultType="com.taotao.pojo.ImportItem">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>?搜索服務發布
預熱:先了解SolrJ如何訪問solr服務器。
測試代碼
@Testpublic void queryDocument() throws Exception {SolrServer solrServer = new HttpSolrServer("http://192.168.25.154: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"));}}DAO層
public interface SearchDao {SearchResult search(SolrQuery query)throws Exception; } @Component public class SearchDaoImpl implements SearchDao {@Autowiredprivate SolrServer solrServer;@Overridepublic SearchResult search(SolrQuery query) throws Exception {//返回值對象SearchResult result = new SearchResult();//根據查詢條件查詢索引庫QueryResponse queryResponse = solrServer.query(query);//取查詢結果SolrDocumentList solrDocumentList = queryResponse.getResults();//取查詢結果總數量 result.setRecordCount(solrDocumentList.getNumFound());//商品列表List<ImportItem> itemList = new ArrayList<>();//取高亮顯示Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();//取商品列表for (SolrDocument solrDocument : solrDocumentList) {//創建一商品對象ImportItem item = new ImportItem();item.setId((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;}POJO類
public class SearchResult {//商品列表private List<ImportItem> itemList;//總記錄數private long recordCount;//總頁數private long pageCount;//當前頁private long curPage;}Service層
public interface SearchService {SearchResult search(String query,int page,int rows)throws Exception; }@Service public class SearchServiceImpl implements SearchService {@Autowiredprivate SearchDao searchDao;@Overridepublic 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();long pageCount = recordCount / rows;if (recordCount % rows > 0) {pageCount++;}searchResult.setPageCount(pageCount);searchResult.setCurPage(page);return searchResult;}}Controller層
@Autowiredprivate SearchService searchService;@RequestMapping(value="/query", method=RequestMethod.GET)@ResponseBodypublic TaotaoResult search(@RequestParam("q")String queryString, @RequestParam(defaultValue="1")Integer page, @RequestParam(defaultValue="60")Integer rows) {//查詢條件不能為空if (StringUtils.isBlank(queryString)) {return TaotaoResult.build(400, "查詢條件不能為空");}SearchResult searchResult = null;try {queryString=new String(queryString.getBytes("iso8859-1"),"utf-8");searchResult = searchService.search(queryString, page, rows);} catch (Exception e) {e.printStackTrace();return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));}return TaotaoResult.ok(searchResult);}?
轉載于:https://www.cnblogs.com/legion/p/9717724.html
總結
以上是生活随笔為你收集整理的Solr的安装和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA系列(四)一部署war 和 wa
- 下一篇: 网络工程:3.1 RIP(Routing