一、Solrj的使用

  1.什么是Solrj

  solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:

  

  2.如何使用

    需要的是solrj的包与拓展服务包

    

    使用solrj完成索引的维护:

    在solr中,索引库中都会存在一个唯一键,如果一个Document的id存在,则执行修改操作,如果不存在,则执行添加操作。

      添加/修改索引:   

    1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。

    2、 创建SolrInputDocument对象,然后通过它来添加域。

    3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。

    4、 提交。

  1. @Test
  2. public void addDocument() throws Exception {
  3.  
  4. // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
  5. // 参数:solr服务器的访问地址
  6. HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
  7. // 2、 创建SolrInputDocument对象,然后通过它来添加域。
  8. SolrInputDocument document = new SolrInputDocument();
  9. // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
  10. // 第二个参数:域的值
  11. // 注意:id的域不能少
  12. document.addField("id", "c0001");
  13. document.addField("title_ik", "使用solrJ添加的文档");
  14. document.addField("content_ik", "文档的内容");
  15. document.addField("product_name", "商品名称");
  16. // 3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。
  17. server.add(document);
  18. // 4、 提交。
  19. server.commit();
  20. }

      在界面查询索引查看效果:使用域名:名称,例如 id:c001的格式

    

      根据ID删除索引

  1. @Test
  2. public void deleteDocument() throws Exception {
  3. // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
  4. // 参数:solr服务器的访问地址
  5. HttpSolrServer server = new HttpSolrServer(
  6. "http://localhost:8080/solr/");
  7. // 根据ID删除
  8. server.deleteById("c0001");
  9. // 提交
  10. server.commit();
  11. }

      根据条件删除

  1. @Test
  2. public void deleteDocumentByQuery() throws Exception {
  3. // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
  4. // 参数:solr服务器的访问地址
  5. HttpSolrServer server = new HttpSolrServer(
  6. "http://localhost:8080/solr/");
  7. // 根据ID删除
  8. server.deleteByQuery("id:c0001");
  9. // 全部删除
  10. // server.deleteByQuery("*:*");
  11. // 提交
  12. server.commit();
  13. }

      查询索引

  1. @Test
  2. public void queryIndex() throws Exception {
  3. // 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
  4. // 参数:solr服务器的访问地址
  5. HttpSolrServer server = new HttpSolrServer(
  6. "http://localhost:8080/solr/");
  7.  
  8. // 创建SolrQuery对象
  9. SolrQuery query = new SolrQuery();
  10. // 设置查询条件,名称“q”是固定的且必须 的
  11. query.set("q", "id:2");
  12.  
  13. // 调用server的查询方法,查询索引库
  14. QueryResponse response = server.query(query);
  15.  
  16. // 查询结果
  17. SolrDocumentList results = response.getResults();
  18.  
  19. // 查询结果总数
  20. long cnt = results.getNumFound();
  21. System.out.println("查询结果总数:" + cnt);
  22.  
  23. for (SolrDocument solrDocument : results) {
  24. System.out.println(solrDocument.get("id"));
  25. System.out.println(solrDocument.get("product_name"));
  26. System.out.println(solrDocument.get("product_price"));
  27. System.out.println(solrDocument.get("product_catalog_name"));
  28. System.out.println(solrDocument.get("product_picture"));
  29.  
  30. }
  31. }

      复杂查询

  1. @Test
  2. public void queryIndex2() throws Exception {
  3. // 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
  4. // 参数:solr服务器的访问地址
  5. HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
  6.  
  7. // 创建SolrQuery对象
  8. SolrQuery query = new SolrQuery();
  9.  
  10. // 设置查询条件
  11. query.setQuery("钻石");
  12. // 设置过滤条件
  13. query.setFilterQueries("product_catalog_name:幽默杂货");
  14. // 设置排序
  15. query.setSort("product_price", ORDER.desc);
  16. // 设置分页信息
  17. query.setStart(0);
  18. query.setRows(10);
  19.  
  20. // 设置显得的域的列表
  21. query.setFields("id", "product_name", "product_price",
  22. "product_catalog_name", "product_picture");
  23.  
  24. // 设置默认搜索域
  25. query.set("df", "product_name");
  26.  
  27. // 设置高亮
  28. query.setHighlight(true);
  29. query.addHighlightField("product_name");
  30. query.setHighlightSimplePre("<em>");
  31. query.setHighlightSimplePost("</em>");
  32.  
  33. // 调用server的查询方法,查询索引库
  34. QueryResponse response = server.query(query);
  35.  
  36. // 查询结果
  37. SolrDocumentList results = response.getResults();
  38.  
  39. // 查询结果总数
  40. long cnt = results.getNumFound();
  41. System.out.println("查询结果总数:" + cnt);
  42.  
  43. for (SolrDocument solrDocument : results) {
  44. System.out.println(solrDocument.get("id"));
  45.  
  46. String productName = (String) solrDocument.get("product_name");
  47.  
  48. //获取高亮列表
  49. Map<String, Map<String, List<String>>> highlighting = response
  50. .getHighlighting();
  51. //获得本文档的高亮信息
  52. List<String> list = highlighting.get(solrDocument.get("id")).get(
  53. "product_name");
  54. //如果有高亮,则把商品名称赋值为有高亮的那个名称
  55. if (list != null) {
  56. productName = list.get(0);
  57. }
  58.  
  59. System.out.println(productName);
  60. System.out.println(solrDocument.get("product_price"));
  61. System.out.println(solrDocument.get("product_catalog_name"));
  62. System.out.println(solrDocument.get("product_picture"));
  63.  
  64. }
  65. }

Solr第二讲——SolrJ客户端的使用与案例的更多相关文章

  1. 使用SolrJ客户端管理SolrCloud(Solr集群)

    1.使用SolrJ客户端管理SolrCloud(Solr集群). package com.taotao.search.service; import java.io.IOException; impo ...

  2. 购物商城学习--第二讲(maven工程介绍)

    接下来第二讲介绍整体工程如何使用maven搭建的. 使用maven管理工程的好处: jar包的管理: 工程之间的依赖管理: 自动打包 maven常见打包方式:jar.war和pom三种.jar工程,是 ...

  3. MySQL实战45讲学习笔记:日志系统(第二讲)

    一.重要的日志模块:redo log 1.通过酒店掌柜记账思路刨析redo log工作原理 2.InnoDB 的 redo log 是固定大小的 只要赊账记录在了粉板上或写了账本上,之后即使掌柜忘记了 ...

  4. (转)【风宇冲】Unity3D教程宝典之AssetBundles:第二讲

    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院                             AssetBundles第二讲:AssetBundles与脚本 所有Unity的As ...

  5. solr 学习之solrJ

    solrJ是访问Solr服务的JAVA客户端,提供索引和搜索的请求方法,SolrJ通常嵌入在业务系统中,通过solrJ的API接口操作Solr服务. <!-- https://mvnreposi ...

  6. WebApp 安全风险与防护课堂(第二讲)开课了!

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在昨天的公开课中,由于参与的小伙伴们积极性和热情非常高,我们的讲师Carl ...

  7. POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取

    第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...

  8. Stanford机器学习---第二讲. 多变量线性回归 Linear Regression with multiple variable

    原文:http://blog.csdn.net/abcjennifer/article/details/7700772 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  9. 【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的

    [军哥谈CI框架]之入门教程之第二讲:分析CI结构和CI是怎么工作的   之入门教程之第二讲:分析CI结构和CI是如何工作的大家好!上一节,我们共同部署了一个CI网站,做到这一点非常简单,但是,亲们, ...

随机推荐

  1. 解析纯真IP地址库

    一周以来,一直在做 IP地址库的解析.从调研到编码到优化,大概花了有七八天的时间.感觉很好玩.总结一下整个做的过程. 1.关于IP 地址库的解析方式 目前主要的解析方式有两种:通过API,或通过IP数 ...

  2. 调整home和根分区大小

    目标:将VolGroup-lv_home缩小到100G,并将剩余的空间添加给VolGroup-lv_root ============================================= ...

  3. 20165322 第九周 实现mypwd

    实现mypwd 学习pwd man pwd 该命令用来显示目前所在的工作目录 参数 -P显示当前目录的物理路径 -L显示当前目录的连接路径 man -k dir | grep 2 由图可知,可以用ge ...

  4. php------中文出现乱码解决方法

    中文出现乱码解决方法:原因编码格式不一致 [1]  建立数据库的时候,字符集选择utf-8  数据库,点表名,点右键,数据库属性…. [2]  修改myspl的配置,在[myspld]模块下面添加ch ...

  5. yii2.0 在save保存之前的操作(放在模型model文件内)

    public function beforeSave($insert){ if(parent::beforeSave($insert)) { if($insert) { } else { } retu ...

  6. 虚拟机Centos安装docker小记

    本书记录是参考 <Spring Cloud 与 Docker 微服务架构实战(第二版)>这本书实现的. 记录简单几个命令,安装顺序如下: 1. 安装docker所需的包 sudo yum ...

  7. java8的4大核心函数式接口

    //java8的4大核心函数式接口//1.Consumer<T>:消费性接口//需求:public void happy(double money, Consumer<Double& ...

  8. [转]表单提交:button input submit 的区别

    博客转自于   http://harttle.com/2015/08/03/form-submit.html  ,同时自己做了稍微改动 最近项目代码中的表单提交的方式已经百花齐放了,现在用这篇文章来整 ...

  9. FreeRTOS 查询任务 剩余的栈空间的 方法

    FreeRTOS 源码下载地址 1.官方文档提供了   函数  用来查询  任务 剩余   栈 空间,首先是看官方的文档解释(某位大神 翻译 的 官方文档.) 参数解释:     xTask:被查询任 ...

  10. wordpress上传含中文文件名出现乱码

    一.首先到FTP里面找到wp-admin/includes/file.php这个文件. 二.查找wp_handle_upload在文件里面找到以下代码. function wp_handle_uplo ...