Solr第二讲——SolrJ客户端的使用与案例
一、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、 提交。
- @Test
- public void addDocument() throws Exception {
- // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
- // 参数:solr服务器的访问地址
- HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
- // 2、 创建SolrInputDocument对象,然后通过它来添加域。
- SolrInputDocument document = new SolrInputDocument();
- // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
- // 第二个参数:域的值
- // 注意:id的域不能少
- document.addField("id", "c0001");
- document.addField("title_ik", "使用solrJ添加的文档");
- document.addField("content_ik", "文档的内容");
- document.addField("product_name", "商品名称");
- // 3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。
- server.add(document);
- // 4、 提交。
- server.commit();
- }
在界面查询索引查看效果:使用域名:名称,例如 id:c001的格式
根据ID删除索引
- @Test
- public void deleteDocument() throws Exception {
- // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
- // 参数:solr服务器的访问地址
- HttpSolrServer server = new HttpSolrServer(
- "http://localhost:8080/solr/");
- // 根据ID删除
- server.deleteById("c0001");
- // 提交
- server.commit();
- }
根据条件删除
- @Test
- public void deleteDocumentByQuery() throws Exception {
- // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
- // 参数:solr服务器的访问地址
- HttpSolrServer server = new HttpSolrServer(
- "http://localhost:8080/solr/");
- // 根据ID删除
- server.deleteByQuery("id:c0001");
- // 全部删除
- // server.deleteByQuery("*:*");
- // 提交
- server.commit();
- }
查询索引
- @Test
- public void queryIndex() throws Exception {
- // 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
- // 参数:solr服务器的访问地址
- HttpSolrServer server = new HttpSolrServer(
- "http://localhost:8080/solr/");
- // 创建SolrQuery对象
- SolrQuery query = new SolrQuery();
- // 设置查询条件,名称“q”是固定的且必须 的
- query.set("q", "id:2");
- // 调用server的查询方法,查询索引库
- QueryResponse response = server.query(query);
- // 查询结果
- SolrDocumentList results = response.getResults();
- // 查询结果总数
- long cnt = results.getNumFound();
- System.out.println("查询结果总数:" + cnt);
- for (SolrDocument solrDocument : results) {
- System.out.println(solrDocument.get("id"));
- System.out.println(solrDocument.get("product_name"));
- System.out.println(solrDocument.get("product_price"));
- System.out.println(solrDocument.get("product_catalog_name"));
- System.out.println(solrDocument.get("product_picture"));
- }
- }
复杂查询
- @Test
- public void queryIndex2() throws Exception {
- // 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
- // 参数:solr服务器的访问地址
- HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
- // 创建SolrQuery对象
- SolrQuery query = new SolrQuery();
- // 设置查询条件
- query.setQuery("钻石");
- // 设置过滤条件
- query.setFilterQueries("product_catalog_name:幽默杂货");
- // 设置排序
- query.setSort("product_price", ORDER.desc);
- // 设置分页信息
- query.setStart(0);
- query.setRows(10);
- // 设置显得的域的列表
- query.setFields("id", "product_name", "product_price",
- "product_catalog_name", "product_picture");
- // 设置默认搜索域
- query.set("df", "product_name");
- // 设置高亮
- query.setHighlight(true);
- query.addHighlightField("product_name");
- query.setHighlightSimplePre("<em>");
- query.setHighlightSimplePost("</em>");
- // 调用server的查询方法,查询索引库
- QueryResponse response = server.query(query);
- // 查询结果
- SolrDocumentList results = response.getResults();
- // 查询结果总数
- long cnt = results.getNumFound();
- System.out.println("查询结果总数:" + cnt);
- for (SolrDocument solrDocument : results) {
- System.out.println(solrDocument.get("id"));
- String productName = (String) solrDocument.get("product_name");
- //获取高亮列表
- Map<String, Map<String, List<String>>> highlighting = response
- .getHighlighting();
- //获得本文档的高亮信息
- List<String> list = highlighting.get(solrDocument.get("id")).get(
- "product_name");
- //如果有高亮,则把商品名称赋值为有高亮的那个名称
- if (list != null) {
- productName = list.get(0);
- }
- System.out.println(productName);
- System.out.println(solrDocument.get("product_price"));
- System.out.println(solrDocument.get("product_catalog_name"));
- System.out.println(solrDocument.get("product_picture"));
- }
- }
Solr第二讲——SolrJ客户端的使用与案例的更多相关文章
- 使用SolrJ客户端管理SolrCloud(Solr集群)
1.使用SolrJ客户端管理SolrCloud(Solr集群). package com.taotao.search.service; import java.io.IOException; impo ...
- 购物商城学习--第二讲(maven工程介绍)
接下来第二讲介绍整体工程如何使用maven搭建的. 使用maven管理工程的好处: jar包的管理: 工程之间的依赖管理: 自动打包 maven常见打包方式:jar.war和pom三种.jar工程,是 ...
- MySQL实战45讲学习笔记:日志系统(第二讲)
一.重要的日志模块:redo log 1.通过酒店掌柜记账思路刨析redo log工作原理 2.InnoDB 的 redo log 是固定大小的 只要赊账记录在了粉板上或写了账本上,之后即使掌柜忘记了 ...
- (转)【风宇冲】Unity3D教程宝典之AssetBundles:第二讲
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 AssetBundles第二讲:AssetBundles与脚本 所有Unity的As ...
- solr 学习之solrJ
solrJ是访问Solr服务的JAVA客户端,提供索引和搜索的请求方法,SolrJ通常嵌入在业务系统中,通过solrJ的API接口操作Solr服务. <!-- https://mvnreposi ...
- WebApp 安全风险与防护课堂(第二讲)开课了!
本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在昨天的公开课中,由于参与的小伙伴们积极性和热情非常高,我们的讲师Carl ...
- POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取
第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...
- Stanford机器学习---第二讲. 多变量线性回归 Linear Regression with multiple variable
原文:http://blog.csdn.net/abcjennifer/article/details/7700772 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...
- 【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的
[军哥谈CI框架]之入门教程之第二讲:分析CI结构和CI是怎么工作的 之入门教程之第二讲:分析CI结构和CI是如何工作的大家好!上一节,我们共同部署了一个CI网站,做到这一点非常简单,但是,亲们, ...
随机推荐
- List 的 removeAll 方法的效率
List 的 removeAll 方法的效率低的原因: 要遍历source,对dest进行contain操作,而contain又要遍历dest进行equal比较. 解决办法:dest转为set,用se ...
- .net 流(Stream) - StreamWriter和StreamReader、BinaryReader和BinaryWriter
转自:http://www.oseye.net/user/kevin/blog/86 一.StreamWriter和StreamReader 从上一篇博文可知文件流.内存流和网络流操作的都是字节,每次 ...
- BZOJ3238:[AHOI2013]差异(SAM)
Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...
- 禁止查看网页源代码和F12
function disableInfo() { document.onkeydown = function() { var e = window.event || arguments[0]; //屏 ...
- (第二场)D Money 【dp\贪心】
题目:https://www.nowcoder.com/acm/contest/140/D 题目描述: White Cloud has built n stores numbered from 1 t ...
- 实例:接口并发限流RateLimiter
需求:接口每秒最多只能相应1个请求 1.创建 全局类对象 import com.google.common.util.concurrent.RateLimiter; import org.spring ...
- @RestController失效
@RestController 注解失效.就是本来应该是直接返回数据.而不是去查找视图.但是去查找视图了.我这人不喜欢弄一些无用的配置文件.所以用到什么.引用什么.但是也容易犯错误.不过也好.对哪里出 ...
- Extjs header column 自定义排序规则
Extjs 的表格自带排序功能,这个功能在大部分情况下能够满足我们的需求,但是在某种情况下,例如IP排序,默认情况下,按照字符串进行排序, 此时我们需要自定义排序规则,这个时候就需要我们重写方法了, ...
- 数据库——MySQL——索引——索引原理及B+树
索引原理 我们使用索引,就是为了提高查询的效率,如同查书一样,先找到章,再找到章中对于的小节,再找到具体的页码,再到我们需要的内容. 事实上索引的本质就是不断缩小获取数据的筛选范围,找出我们想要的结果 ...
- Oracle记录类型(record)和%rowtype
Oracle中的记录类型(record)和使用%rowtype定义的数据类型都是一种单行多列的数据结构,可以理解为一个具有多个属性的对象.其中属性名即为列名. 记录类型(record) 记录类型是一种 ...