转:

使用solrJ操作solr常用方法

2017年08月07日 22:49:06 成都往右 阅读数:8990
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37334135/article/details/76862508

既然学的是java那么肯定需要用java代码来进行对solr的操作,如果知道在solr后台管理界面进行增删改查等操作,那么用solrJ操作solr会更好理解。

solrJ介绍
solrJ是一个用来访问solr的java客户端,提供了索引和搜索的方法(将一些常用的命令封装进去了),通过solrJ提供的API 接口来操作solr服务。

准备工作
创建个maven工程(普通的java工程都可以不过需要自己导包),添加依赖如下:

<dependencies>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.2</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注:有的大神介绍说添加第一个solrj的依赖就行,但是我这里测试的时候发现还是需要commons-logging的依赖的,另外,如果你本地仓库没有zookeeper-3.4.6.jar跟slf4j-api-1.7.6.jar也会直接报错,自己去网上下一个吧,最终包结构我也截了个图。

然后启动solr服务器,接下来进行操作。
1、添加文档

    /*
* 测试向索引库中添加文档
*/
@Test
public void testSave() throws Exception{
//1.创建连接对象
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2.创建一个文档对象
SolrInputDocument inputDocument = new SolrInputDocument();
//向文档中添加域以及对应的值,注意:所有的域必须在schema.xml中定义过,前面已经给出过我定义的域。
inputDocument.addField("id", "1");
inputDocument.addField("item_title", "sansung爆炸牌手机");
inputDocument.addField("item_price", 666);
inputDocument.addField("item_image", "www.boom.png");
//3.将文档写入索引库中
solrServer.add(inputDocument);
//提交
solrServer.commit();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

后台管理界面查询id为1的商品看看

2、修改文档

    /*
* 测试修改索引库中已存在的文档
*/
@Test
public void testUpdate() throws Exception{
//1.创建连接对象
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2.创建一个文档对象
SolrInputDocument inputDocument = new SolrInputDocument();
inputDocument.addField("id", "1");
//修改id为1的商品的信息(如果该商品不存在其实就是添加了)
inputDocument.addField("item_title", "vivo手机hahaha");
inputDocument.addField("item_price", 6666);
inputDocument.addField("item_image", "www.123.png");
//3.将文档写入索引库中
solrServer.add(inputDocument);
//提交
solrServer.commit();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

再去后台管理页面查询id为1的商品看看

3、删除文档

    /*
* 测试删除文档:根据id删除文档 *
*/
@Test
public void testDeleteById() throws Exception{
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//删除文档
solrServer.deleteById("1");
//提交
solrServer.commit();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
    /*
* 测试删除文档:根据查询结果删除文档(重新添加id为1的文档)
*/
@Test
public void testDeleteByQ() throws Exception{
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//根据查询结果删除文档,注意:用item_image的查询结果来进行删除是不行的
//因为制定业务域的时候indexed=false,即不被索引,此时是不能根据图片来查询的。
solrServer.deleteByQuery("item_title:vivo手机hahaha");
solrServer.commit();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

不管是根据id删除还是根据查询删除都能达到一样的效果。
4、查询索引

1、简单根据id查询索引

    /*
* 简单查询:查询单个商品信息
*/
@Test
public void testSimpleQ() throws Exception{
//1.创建连接
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2.创建查询语句
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.set("q", "id:1");
//4.执行查询
QueryResponse queryResponse = solrServer.query(query);
//5.取文档列表public class SolrDocumentList extends ArrayList<SolrDocument>
SolrDocumentList documentList = queryResponse.getResults();
for (SolrDocument solrDocument : documentList) {
//取各个文档信息
System.out.println("商品id:"+solrDocument.get("id")+" ");
System.out.println("商品标题:"+solrDocument.get("item_title")+" ");
System.out.println("商品价格:"+solrDocument.get("item_price")+" ");
System.out.println("商品图片:"+solrDocument.get("item_image")+" ");
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
输出结果:
商品id:1
商品标题:vivo手机hahaha
商品价格:6666
商品图片:www.123.png
  • 1
  • 2
  • 3
  • 4
  • 5

2、设置条件进行查询

@Test
public void testSimpleQ2 () throws Exception{
//1.创建连接
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2.创建查询语句
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.set("q", "夏普");//设置查询关键字
query.setSort("id", ORDER.desc);//按照id降序排列
query.setStart(1);
query.setRows(3);//分页条件
query.set("df", "item_title");//默认在商品标题域进行查询
//4、执行查询
QueryResponse queryResponse = solrServer.query(query);
//5.获取文档列表
SolrDocumentList documentList = queryResponse.getResults();
//获取总记录数
long numFound = documentList.getNumFound();
System.out.println("总记录数:" + numFound);
for (SolrDocument solrDocument : documentList) {
//取各个文档信息
System.out.print("商品id:"+solrDocument.get("id")+" ");
System.out.print("商品标题:"+solrDocument.get("item_title")+" ");
System.out.print("商品价格:"+solrDocument.get("item_price")+" ");
System.out.println();
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

注:如果设置了默认查询域的话,自己又不想在这个域内查那么在查询关键字前要注明要在哪个域查,比如:”item_price:600”

输出结果:
总记录数:19
商品id:936920 商品标题:夏普(SHARP)LCD-52DS70A 52英寸 日本原装液晶面板 3D Android操作系统智能液晶电视 商品价格:699900
商品id:816753 商品标题:夏普(SHARP)LCD-46DS40A 46英寸 日本原装液晶面板 智能全高清液晶电视 商品价格:379900
商品id:1356054 商品标题:夏普(SHARP)LCD-50DS72A 50英寸 无线网络 安卓智能 4K超高清液晶电视 商品价格:549900
  • 1
  • 2
  • 3
  • 4
  • 5

3、带高亮的复杂查询

    /*
* 测试复杂查询:取高亮
*/
@Test
public void testHighLighting() throws Exception{
//1、创建连接
SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//2、创建查询语句
SolrQuery query = new SolrQuery();
//3、设置查询条件
query.set("q", "夏普");//设置查询关键字
query.setSort("id", ORDER.desc);//按照id降序排列
query.setStart(1);
query.setRows(5);//分页条件
query.set("df", "item_title"); //开启高亮显示
query.setHighlight(true);
query.setHighlightSimplePre("<em>");
query.setHighlightSimplePost("</em>"); //4、执行查询
QueryResponse queryResponse = solrServer.query(query);
//5、取高亮
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
//6、获取文档列表
SolrDocumentList documentList = queryResponse.getResults();
//7、遍历查询结果
for (SolrDocument solrDocument : documentList) {
System.out.print(solrDocument.get("id")+" ");
List<String> titleList = highlighting.get(solrDocument.get("id")).get("item_title");
if (titleList !=null && titleList.size()>0) {
//能取到高亮,输出高亮
System.out.print(titleList.get(0));
}
System.out.println();
} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
输出结果:
936920 <em>夏普</em>(SHARP)LCD-52DS70A 52英寸 日本原装液晶面板 3D Android操作系统智能液晶电视
816753 <em>夏普</em>(SHARP)LCD-46DS40A 46英寸 日本原装液晶面板 智能全高清液晶电视
1356054 <em>夏普</em>(SHARP)LCD-50DS72A 50英寸 无线网络 安卓智能 4K超高清液晶电视
1322968 <em>夏普</em>(SHARP)LCD-40DS13A 40英寸液晶电视
1322963 <em>夏普</em>(SHARP)LCD-32DS13A 32英寸液晶电视
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如果看了关于在solr后台管理页面进行的相关操作后,再看这个solrJ应该就瞬间会了。

使用solrJ操作solr常用方法 【注释非常详细,非常好】的更多相关文章

  1. 利用SolrJ操作solr API完成index操作

    使用SolrJ操作Solr会比利用httpClient来操作Solr要简单.SolrJ是封装了httpClient方法,来操作solr的API的.SolrJ底层还是通过使用httpClient中的方法 ...

  2. 使用solrj操作solr索引库

    (solrj)初次使用solr的开发人员总是很郁闷,不知道如何去操作solr索引库,以为只能用<五分钟solr4.5教程(搭建.运行)>中讲到的用xml文件的形式提交数据到索引库,其实没有 ...

  3. 使用solrj操作solr索引库,solr是lucene服务器

    客户端开发 Solrj 客户端开发 Solrj Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了 Solrj是Sol ...

  4. Solr 09 - SolrJ操作Solr单机服务 (Solr的Java API)

    目录 1 SolrJ是什么 2 SolrJ对索引的CRUD操作 2.1 创建Maven工程(打包方式选择为jar) 2.2 配置pom.xml文件, 加入SolrJ的依赖 2.3 添加和修改索引 2. ...

  5. solrj 操作 solr 单机版

    一.导入 jar 包 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr- ...

  6. solrj 操作 solr 集群版

    一.添加 @Test public void testAddDocument() throws Exception{ //创建一个集群的连接,应该使用 CloudSolrServer,//zkHost ...

  7. Solr 14 - SolrJ操作SolrCloud集群 (Solr的Java API)

    目录 1 pom.xml文件的配置 2 SolrJ操作SolrCloud 1 pom.xml文件的配置 项目的pom.xml依赖信息请参照: Solr 09 - SolrJ操作Solr单机服务 (So ...

  8. Java操作Solr之SolrJ

    添加SolrJ的jar包 solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务, <depende ...

  9. solr简介、学习详细过程!(超详细~)

    solr是什么呢? 一.Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中. 二.Solr 提供了层面搜索(就是统计).命中醒目显示并且支持多种输出 ...

随机推荐

  1. 20155310 Exp6 信息收集与漏洞扫描

    20155310 Exp6 信息收集与漏洞扫描 基础问题回答 1.哪些组织负责DNS,IP的管理. 顶级的管理者是Internet Corporation for Assigned Names and ...

  2. 20155317 王新玮《网络对抗技术》实验5 MSF基础应用

    20155317 王新玮<网络对抗技术>实验5 MSF基础应用 1. MS08_067安全漏洞 原理:攻击者利用受害者主机默认开放的SMB服务端口445,发送特殊RPC请求,通过MSRPC ...

  3. python 回溯法 子集树模板 系列 —— 15、总结

    作者:hhh5460 时间:2017年6月3日 用回溯法子集树模板解决了这么多问题,这里总结一下使用回溯法子集树模板的步骤: 1.确定元素及其状态空间(精髓) 对每一个元素,遍历它的状态空间,其它的事 ...

  4. kali黑客渗透测试基础环境准备

    1.apt-get install python-nmap 2.apt-get install python-setuptools 正在读取软件包列表... 完成 正在分析软件包的依赖关系树      ...

  5. cookie提取dex文件

    有时候在java层能获取dex文件的cookie,但是在java不能从cookie得到dex,如果想要获取只能通过jni在C层实现,具体实现代码如下(nexus手机4.4系统) static void ...

  6. 云服务器+tomcat+mysql+web项目搭建部署

    云服务器+tomcat+mysql+web项目搭建部署 1.老样子,开头墨迹两句. 作为我的第二篇文章,有很多感慨,第一篇人气好低啊,有点小丧气,不过相信我还是经验少,分享的都是浅显的,所以大家可能不 ...

  7. 使用plumbing命令来深入理解git add和git commit的工作原理

    前言: plumbing命令 和 porcelain命令 git中的命令分为plumbing命令和porcelain命令: porcelain命令就是我们常用的git add,git commit等命 ...

  8. 怎么用JavaScript写一个区块链?

    几乎所有语言都可以编写区块链开发程序.那么如何用JavaScript写一个区块链?以下我将要用JavaScript来创建1个简单的区块链来演示它们的内部到底是怎样工作的.我将会称作SavjeeCoin ...

  9. 一些常用SQL语句大全

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  10. 软件项目第一次sprint评分表