安装
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);}