一、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. List 的 removeAll 方法的效率

    List 的 removeAll 方法的效率低的原因: 要遍历source,对dest进行contain操作,而contain又要遍历dest进行equal比较. 解决办法:dest转为set,用se ...

  2. .net 流(Stream) - StreamWriter和StreamReader、BinaryReader和BinaryWriter

    转自:http://www.oseye.net/user/kevin/blog/86 一.StreamWriter和StreamReader 从上一篇博文可知文件流.内存流和网络流操作的都是字节,每次 ...

  3. BZOJ3238:[AHOI2013]差异(SAM)

    Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...

  4. 禁止查看网页源代码和F12

    function disableInfo() { document.onkeydown = function() { var e = window.event || arguments[0]; //屏 ...

  5. (第二场)D Money 【dp\贪心】

    题目:https://www.nowcoder.com/acm/contest/140/D 题目描述: White Cloud has built n stores numbered from 1 t ...

  6. 实例:接口并发限流RateLimiter

    需求:接口每秒最多只能相应1个请求 1.创建 全局类对象 import com.google.common.util.concurrent.RateLimiter; import org.spring ...

  7. @RestController失效

    @RestController 注解失效.就是本来应该是直接返回数据.而不是去查找视图.但是去查找视图了.我这人不喜欢弄一些无用的配置文件.所以用到什么.引用什么.但是也容易犯错误.不过也好.对哪里出 ...

  8. Extjs header column 自定义排序规则

    Extjs 的表格自带排序功能,这个功能在大部分情况下能够满足我们的需求,但是在某种情况下,例如IP排序,默认情况下,按照字符串进行排序, 此时我们需要自定义排序规则,这个时候就需要我们重写方法了, ...

  9. 数据库——MySQL——索引——索引原理及B+树

    索引原理 我们使用索引,就是为了提高查询的效率,如同查书一样,先找到章,再找到章中对于的小节,再找到具体的页码,再到我们需要的内容. 事实上索引的本质就是不断缩小获取数据的筛选范围,找出我们想要的结果 ...

  10. Oracle记录类型(record)和%rowtype

    Oracle中的记录类型(record)和使用%rowtype定义的数据类型都是一种单行多列的数据结构,可以理解为一个具有多个属性的对象.其中属性名即为列名. 记录类型(record) 记录类型是一种 ...