vlambda博客
学习文章列表

SSM框架中Solr服务器的安装,配置,使用全过程

在你想要放弃的时候想想是什么让你当初坚持走到了这里

1,什么是solr服务器

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

2,使用solr服务器有什么好处

Solr是一个高性能,采用Java开发, Solr Solr 基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

3,solr服务搭建

3.1,solr环境

Solr是java开发。需要安装jdk。安装环境Linux。需要安装Tomcat。

3.2,搭建步骤

这边我用的是云服务器,和vm虚拟机一个操作(需要资料可留言)

第一步:把solr 的压缩包上传到Linux系统第二步:解压solr。

 
   
   
 
  1. Linux命令

  2. tar -xvf 文件名

第三步:安装Tomcat,解压缩即可。

第四步:把solr部署到Tomcat下。

 
   
   
 
  1. 复制解压缩的solr文件夹的dist文件夹里面的war包到tomcatwebapps工程目录下

SSM框架中Solr服务器的安装,配置,使用全过程

第五步:启动Tomcat解压,war包会自动变成文件夹,我这里把文件夹名改成了solr,方便点

 
   
   
 
  1. 启动tomcat的命令是打开tomcat文件夹里面的bin目录

  2. ./startup.sh启动

  3. ./shutdown.sh关闭

  4. 记得开放8080端口

  5. 开放8080端口的代码是

  6. /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

  7. /etc/rc.d/init.d/iptables save

SSM框架中Solr服务器的安装,配置,使用全过程第六步:把解压的solr-4.10.3/example/lib/ext目录下的所有的jar包,添加到solr工程中

 
   
   
 
  1. 复制代码是

  2. cp * /usr/local/tomcat/webapps/solr/WEB-INF/bin/

第七步:创建一个solrhome。/example/solr目录就是一个solrhome。复制此目录到/usr/local/solrhome(和解压的solr文件夹同目录) 第八步:关联solr及solrhome。需要修改solr工程的web.xml文件。SSM框架中Solr服务器的安装,配置,使用全过程第九步:启动Tomcat http://111.111.111.111:8080/solr/ 和windows下的配置完全一样。SSM框架中Solr服务器的安装,配置,使用全过程步骤需要注意的地方:删除tomcat工程下面的war包需要关闭tomcat 配置文件需要把注释去掉 不知道自己的solrhome所在的目录的话,进去目录输入命令pwd查看路径 访问solr工程显示404是自己配置哪里出问题了,重新检查配置 爱你们

3.3,配置业务域

schema.xml中定义(这是我当前的项目所需要的域,自己分析自己需要把哪些放到solr中供搜索) 1、商品Id 2、商品标题 3、商品卖点 4、商品价格 5、商品图片 6、分类名称

创建对应的业务域。需要制定中文分析器(这边搜索的都是中文,需要配置中文分析器)。

创建步骤:第一步:把中文分析器添加到工程中。1、把IKAnalyzer2012FF_u1.jar添加到solr工程的lib目录下

2、把扩展词典、配置文件放到solr工程的WEB-INF/classes目录下SSM框架中Solr服务器的安装,配置,使用全过程第二步:配置一个FieldType,制定使用IKAnalyzer 修改schema.xml文件 修改Solr的schema.xml文件,添加FieldType:

 
   
   
 
  1. <fieldType name="text_ik" class="solr.TextField">

  2. <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

  3. </fieldType>

第三步:配置业务域,type制定使用自定义的FieldType。设置业务系统Field

 
   
   
 
  1. <field name="item_title" type="text_ik" indexed="true" stored="true"/>

  2. <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>

  3. <field name="item_price" type="long" indexed="true" stored="true"/>

  4. <field name="item_image" type="string" indexed="false" stored="true" />

  5. <field name="item_category_name" type="string" indexed="true" stored="true" />


  6. <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>

  7. <copyField source="item_title" dest="item_keywords"/>

  8. <copyField source="item_sell_point" dest="item_keywords"/>

  9. <copyField source="item_category_name" dest="item_keywords"/>

SSM框架中Solr服务器的安装,配置,使用全过程xml文件的路径图片中标出了,在solrhome里面

第四步:重启tomcat

4,搜索工程搭建

SSM框架中Solr服务器的安装,配置,使用全过程要实现搜索功能,需要搭建solr服务、搜索服务工程、搜索系统

4.1,搜索服务工程搭建

e3-search(聚合工程pom) --e3-search-interface(jar) --e3-search-Service(war) e3-search-web(war)SSM框架中Solr服务器的安装,配置,使用全过程

5,使用solrJ管理索引库

5.1,添加文档

第一步:把solrJ的jar包添加到工程中。第二步:创建一个SolrServer,使用HttpSolrServer创建对象。第三步:创建一个文档对象SolrInputDocument对象。第四步:向文档中添加域。必须有id域,域的名称必须在schema.xml中定义。第五步:把文档添加到索引库中。第六步:提交。

 
   
   
 
  1. @Test

  2. public void addDocument() throws Exception {

  3. //创建一个SolrServer对象,创建一个连接。参数solr服务的url

  4. SolrServer solrServer = new HttpSolrServer("http://111.111.111.111:8080/solr/collection1");

  5. //创建一个文档对象SolrInputDocument

  6. SolrInputDocument document = new SolrInputDocument();

  7. //向文档对象中添加域。文档中必须包含一个id域,所有的域的名称必须在schema.xml中定义。

  8. document.addField("id", "doc01");

  9. document.addField("item_title", "测试商品01");

  10. document.addField("item_price", 1000);

  11. //把文档写入索引库

  12. solrServer.add(document);

  13. //提交

  14. solrServer.commit();

  15. }

5.2,删除文档

 
   
   
 
  1. @Test

  2. public void deleteDocument() throws Exception {

  3. SolrServer solrServer = new HttpSolrServer("http://111.111.111.111:8080/solr/collection1");

  4. //删除文档

  5. //solrServer.deleteById("doc01");//根据id删除

  6. solrServer.deleteByQuery("id:doc01");//根据查询删除

  7. //提交

  8. solrServer.commit();

  9. }

5.3,查询索引库

查询步骤:第一步:创建一个SolrServer对象 第二步:创建一个SolrQuery对象。第三步:向SolrQuery中添加查询条件、过滤条件。。。第四步:执行查询。得到一个Response对象。第五步:取查询结果。第六步:遍历结果并打印。

5.3.1,简单查询

 
   
   
 
  1. @Test

  2. public void queryIndex() throws Exception {

  3. //创建一个SolrServer对象。

  4. SolrServer solrServer = new HttpSolrServer("http://111.111.111.111:8080/solr/collection1");

  5. //创建一个SolrQuery对象。

  6. SolrQuery query = new SolrQuery();

  7. //设置查询条件。

  8. //query.setQuery("*:*");

  9. query.set("q", "*:*");

  10. //执行查询,QueryResponse对象。

  11. QueryResponse queryResponse = solrServer.query(query);

  12. //取文档列表。取查询结果的总记录数

  13. SolrDocumentList solrDocumentList = queryResponse.getResults();

  14. System.out.println("查询结果总记录数:" + solrDocumentList.getNumFound());

  15. //遍历文档列表,从取域的内容。

  16. for (SolrDocument solrDocument : solrDocumentList) {

  17. System.out.println(solrDocument.get("id"));

  18. System.out.println(solrDocument.get("item_title"));

  19. System.out.println(solrDocument.get("item_sell_point"));

  20. System.out.println(solrDocument.get("item_price"));

  21. System.out.println(solrDocument.get("item_image"));

  22. System.out.println(solrDocument.get("item_category_name"));

  23. }

  24. }

5.3.1,带高亮显示

 
   
   
 
  1. @Test

  2. public void queryIndexFuza() throws Exception {

  3. SolrServer solrServer = new HttpSolrServer("http://111.111.111.111:8080/solr/collection1");

  4. //创建一个查询对象

  5. SolrQuery query = new SolrQuery();

  6. //查询条件

  7. query.setQuery("手机");

  8. query.setStart(0);

  9. query.setRows(20);

  10. query.set("df", "item_title");

  11. query.setHighlight(true);

  12. query.addHighlightField("item_title");

  13. query.setHighlightSimplePre("<em>");

  14. query.setHighlightSimplePost("</em>");

  15. //执行查询

  16. QueryResponse queryResponse = solrServer.query(query);

  17. //取文档列表。取查询结果的总记录数

  18. SolrDocumentList solrDocumentList = queryResponse.getResults();

  19. System.out.println("查询结果总记录数:" + solrDocumentList.getNumFound());

  20. //遍历文档列表,从取域的内容。

  21. Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();

  22. for (SolrDocument solrDocument : solrDocumentList) {

  23. System.out.println(solrDocument.get("id"));

  24. //取高亮显示

  25. List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");

  26. String title = "";

  27. if (list !=null && list.size() > 0 ) {

  28. title = list.get(0);

  29. } else {

  30. title = (String) solrDocument.get("item_title");

  31. }

  32. System.out.println(title);

  33. System.out.println(solrDocument.get("item_sell_point"));

  34. System.out.println(solrDocument.get("item_price"));

  35. System.out.println(solrDocument.get("item_image"));

  36. System.out.println(solrDocument.get("item_category_name"));

  37. }

  38. }

6,把商品数据导入到索引库中

6.1,分析dao层

创建sql语句 创建表对应的pojo 创建mapper映射文件(接口和xml)

6.2,分析service层

创建接口 实现接口 书写代码

 
   
   
 
  1. @Autowired

  2. private ItemMapper itemMapper;

  3. @Autowired

  4. private SolrServer solrServer;


  5. @Override

  6. public E3Result importAllItems() {

  7. try {

  8. //查询商品列表

  9. List<SearchItem> itemList = itemMapper.getItemList();

  10. //遍历商品列表

  11. for (SearchItem searchItem : itemList) {

  12. //创建文档对象

  13. SolrInputDocument document = new SolrInputDocument();

  14. //向文档对象中添加域

  15. document.addField("id", searchItem.getId());

  16. document.addField("item_title", searchItem.getTitle());

  17. document.addField("item_sell_point", searchItem.getSell_point());

  18. document.addField("item_price", searchItem.getPrice());

  19. document.addField("item_image", searchItem.getImage());

  20. document.addField("item_category_name", searchItem.getCatagory_name());

  21. //把文档对象写入索引库

  22. solrServer.add(document);

  23. }

  24. //提交

  25. solrServer.commit();

  26. //返回导入成功

  27. return E3Result.ok();

  28. } catch (Exception e) {

  29. e.printStackTrace();

  30. return E3Result.build(500, "数据导入时发生异常");


  31. }

  32. }

需要在spring中配置ttpSolrServer类(配置子类,service引入父类SolrServer )

6.3,发布服务,用dubbo协议暴露端口

 
   
   
 
  1. <!-- 使用dubbo发布服务 -->

  2. <!-- 提供方应用信息,用于计算依赖关系 -->

  3. <dubbo:application name="e3-search" />

  4. <dubbo:registry protocol="zookeeper" address="111.111.111.111:2181" />

  5. <!-- 用dubbo协议在20880端口暴露服务 -->

  6. <dubbo:protocol name="dubbo" port="20882" />

  7. <!-- 声明需要暴露的服务接口 -->

  8. <dubbo:service interface="cn.e3mall.search.service.SearchItemService" ref="searchItemServiceImpl" timeout="600000"/>

6.4,分析controller层

直接调用就完事,我这是异步请求

 
   
   
 
  1. @Autowired

  2. private SearchItemService searchItemService;


  3. @RequestMapping("/index/item/import")

  4. @ResponseBody

  5. public E3Result importItemList() {

  6. E3Result importAllItems = searchItemService.importAllItems();

  7. return importAllItems;


  8. }

注意,解决mapper映射文件不存在的异常,我在上一篇博客发了,需要请查看

7,搜索功能实现

7.1,dao层分析

 
   
   
 
  1. public SearchResult search(SolrQuery query) throws Exception{

  2. //根据query查询索引库

  3. QueryResponse query2 = solrServer.query(query);

  4. //取查询结果

  5. SolrDocumentList results = query2.getResults();

  6. //取查询结果总记录数

  7. long numFound = results.getNumFound();

  8. SearchResult result=new SearchResult();

  9. result.setRecordCount(numFound);;

  10. List<SearchItem> list=new ArrayList<>();

  11. //取商品列表,需要取高亮显示

  12. Map<String, Map<String, List<String>>> highlighting = query2.getHighlighting();

  13. for (SolrDocument solrDocument : results) {

  14. SearchItem search=new SearchItem();

  15. search.setId((String) solrDocument.get("id"));

  16. search.setCatagory_name((String) solrDocument.get("item_catagory_name"));

  17. search.setImage((String) solrDocument.get("item_image"));

  18. search.setPrice(solrDocument.get("item_price").toString());

  19. search.setSell_point((String) solrDocument.get("item_sell_point"));

  20. //高亮设置显示

  21. List<String> list2 = highlighting.get(solrDocument.get("id")).get("item_title");

  22. String title="";

  23. if(list2!=null&&list2.size()>0) {

  24. title=list2.get(0);

  25. }else {

  26. title=(String) solrDocument.get("item_title");

  27. }

  28. search.setTitle(title);

  29. list.add(search);

  30. }

  31. result.setItemList(list);

  32. return result;

  33. }

7.2,service层分析

 
   
   
 
  1. public SearchResult search(String keyword, int page, int rows) throws Exception {

  2. //创建一个solrQuery对象

  3. SolrQuery query=new SolrQuery();

  4. //设置查询条件

  5. query.setQuery(keyword);

  6. System.out.println("------------------"+keyword);

  7. //设置分页条件

  8. if(page<=0) {

  9. page=1;

  10. }

  11. query.setStart((page-1)*rows);

  12. query.setRows(rows);

  13. //设置默认搜索域

  14. query.set("df", "item_title");

  15. //开启高亮显示

  16. query.setHighlight(true);

  17. query.addHighlightField("item_title");//设置高亮显示的域

  18. query.setHighlightSimplePre("<em style=\"color=red\">");//设置高亮标签前缀

  19. query.setHighlightSimplePost("</em>");//设置高亮标签后缀

  20. //调用dao执行查询

  21. SearchResult search = searchDao.search(query);

  22. //计算总页数

  23. Long recordCount = search.getRecordCount();

  24. System.out.println(recordCount+"------------");

  25. search.setTotalPages((int) Math.ceil(recordCount/rows));

  26. //返回结果


  27. return search;


  28. }

7.2,controller层分析

 
   
   
 
  1. @RequestMapping("/search")

  2. public String searchItemList(String keyword,@RequestParam(defaultValue = "1")Integer page

  3. ,Model model) throws Exception{

  4. //get请求转码

  5. keyword=new String(keyword.getBytes("iso-8859-1"),"UTF-8");


  6. SearchResult search = searchService.search(keyword, page, rows);

  7. //把结果传递给页面

  8. model.addAttribute("query", keyword);

  9. System.out.println(keyword);

  10. model.addAttribute("totalPages", search.getTotalPages());

  11. System.out.println(search.getTotalPages());

  12. model.addAttribute("page", page);

  13. System.out.println(page);

  14. model.addAttribute("recourdCount", search.getRecordCount());

  15. System.out.println(search.getRecordCount());

  16. model.addAttribute("itemList", search.getItemList());

  17. System.out.println(search.getItemList());


  18. return "search";

  19. }

结束!

实际项目开发可查看Solr集群搭建之SolrCould以及实际项目开发中详细使用步骤这篇文章